Контекстные локаторы - как они делают глобальные переменные локального контекста?
Я читал док файл Flask и встретил this:
... Для веб-приложений его решающее значение для реагировать на данные, отправленные клиенту на сервер. В Flask эта информация предоставляемый глобальным объектом запроса. Если у вас есть опыт работы с Python, вам может быть интересно, как это объект может быть глобальным и как Flask удается по-прежнему быть потокобезопасными. ответ - это локали контекста...
Теперь я понял, что локаторы контекста являются такими, как оператор with
(конечно, это то, что предлагает python 2.6 doc). Я пытаюсь понять, как это позволит вам иметь глобально доступные вары, которые находятся в локальном пространстве имен? Как это концептуально работает?
Также: глобалы, как правило, считаются грязными, я беру их, так почему это так?
Ответы
Ответ 1
Они на самом деле являются прокси-объектами для реальных объектов, поэтому при обращении к ним вы получаете доступ к объекту для текущего потока.
Примером может служить объект request
. Вы можете видеть, что это настроено в globlals.py, а затем импортировано в __init__.py для фляжки.
Преимущество этого в том, что вы можете получить доступ к запросу, просто выполнив
from flask import request
и написать такие методы, как
@app.route('/')
def hello_world():
return "Hello World!"
без необходимости передавать запрос в качестве параметра.
Это использует некоторые библиотеки многократного использования из Werkzeug.
Ответ 2
пространства имен в python - это в основном словари
вы могли бы сделать
globals()['foo']=bar