上下文本地 - 它们如何使本地上下文变量全局化?

Mal*_*ang 13 python

我正在阅读Flask文档 - 并且遇到了这个:

...对于Web应用程序,对客户端发送到服务器的数据做出反应至关重要.在Flask中,此信息由全局请求对象提供.如果您对Python有一些经验,那么您可能想知道该对象如何是全局的以及Flask如何设置仍然是线程安全的.答案是上下文本地人......

现在我理解上下文本地就像with语句一样(当然这就是python 2.6 doc似乎建议的内容).我很难看到这将如何允许您拥有驻留在本地命名空间中的全局可访问的变量?这在概念上如何运作?

另外:全球通常被认为是肮脏的我接受它,所以为什么这样呢?

mik*_*kej 5

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

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

这样做的好处是您只需执行以下操作即可访问请求

from flask import request
Run Code Online (Sandbox Code Playgroud)

并编写方法,如

@app.route('/')
def hello_world():
    return "Hello World!"
Run Code Online (Sandbox Code Playgroud)

无需将请求作为参数传递。

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