上下文局部变量 - 如何将局部上下文变量转为全局?
我在看Flask的文档时,发现了这一段:
... 对于网络应用来说,重要的是要对客户端发送到服务器的数据做出反应。在Flask中,这些信息是通过一个全局的请求对象提供的。如果你对Python有一些了解,可能会好奇这个对象怎么能是全局的,同时Flask又是如何保证线程安全的。答案就是上下文局部变量...
我理解上下文局部变量是像with
语句这样的东西(这也是Python 2.6文档似乎暗示的)。我很难理解这怎么能让你有全局可访问的变量,同时又在一个局部的命名空间里?这个概念是怎么运作的呢?
另外:我知道全局变量通常被认为是不好的做法,那为什么这个是可以的呢?
1 个回答
4
它们其实是指向真实对象的代理对象,这样当你引用一个对象时,就能访问到当前线程的那个对象。
举个例子,比如 request
对象。你可以在 globals.py 文件中看到它是怎么设置的,然后再在 __init__.py 文件中被引入到 Flask 中。
这样做的好处是,你只需要这样就能访问请求:
from flask import request
而且可以写出像这样的函数:
@app.route('/')
def hello_world():
return "Hello World!"
而不需要把请求作为参数传来传去。
这利用了一些来自 Werkzeug 的可重用代码库。