2010-10-26 84 views
12

我读通过烧瓶DOC - 和整个this传来:上下文本地人 - 他们如何使本地上下文变量全局?

...对于Web应用程序是要 关键反应的数据发送到 服务器的客户端。在Flask中,这个信息是由全局请求对象提供的 。 如果您对 Python有一些经验,您可能想知道该对象可以是全局的,以及Flask 如何管理仍然是线程安全的。该 答案是上下文当地人...

现在我明白方面当地人要的东西,如with声明(当然那是在python 2.6 doc似乎什么建议)。我努力想知道这将如何让你拥有驻留在本地命名空间中的全局可访问的变量?这在概念上如何工作?

另请参见:全局变量通常被认为是肮脏的我接受它,那么为什么这是行吗?

+3

这是可以的,因为磨砂全局上下非常彻底。 – aaronasterling 2010-10-26 14:47:45

回答

4

它们实际上是代表对象的实际对象,因此当您引用一个时,您可以访问当前线程的对象。

一个例子是request对象。你可以看到这是在globlals.py中设置的,然后导入__init__.py的烧瓶。

这样做的好处是,你可以通过做

from flask import request 

访问请求和写方法,如

@app.route('/') 
def hello_world(): 
    return "Hello World!" 

,而不必通过周围请求作为参数。

这是利用从Werkzeug一些可重用的代码库。

+0

对不起,如果我是密集的:但如果我得到这个正确他们推上下文到一种'堆栈',然后能够适当地路由属性调用到基于这个堆栈正确的链接对象? – Malang 2010-10-26 10:55:44

+1

如果您获取[Werkzeug的源代码](http://pypi.python.org/packages/source/W/Werkzeug/Werkzeug-0.6.2.tar.gz)的副本并查看“local.py”你会看到'Local'类基本上使用了一个字典,它包含当前线程ID作为密钥来透明地存储和检索正确的对象。如果不设置一些测试来找出代码正在做什么,这是我可以推出的限制。 – mikej 2010-10-26 11:36:29

+0

我不认为上面的堆栈是必要的。这只是一个猜测,但堆栈可能会在链接到的文档中添加与此注释相关的额外图层:*它以智能的方式执行,以便一个应用程序可以调用另一个应用程序而不会中断。* – mikej 2010-10-26 11:37:23

-2

命名空间在Python基本上是字典 你可以做

globals()['foo']=bar
+0

+1好点: ) – Malang 2010-10-26 15:45:47

+0

为什么这会被投票?我希望S/O强制底层选民留下解释。这可能是一个很好的学习。我可能错过了一些东西,但是如果我使用线程ID作为'foo',它看起来像一个完美的线程全局变量,它与接受的答案基本相同。Python内置'dict'是线程安全的。 – 2015-02-07 18:50:35

相关问题