上下文局部变量 - 如何将局部上下文变量转为全局?

13 投票
1 回答
3895 浏览
提问于 2025-04-16 06:05

我在看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 的可重用代码库。

撰写回答