Подтвердить что ты не робот

Контекстные локаторы - как они делают глобальные переменные локального контекста?

Я читал док файл Flask и встретил this:

... Для веб-приложений его решающее значение для реагировать на данные, отправленные клиенту на сервер. В Flask эта информация предоставляемый глобальным объектом запроса. Если у вас есть опыт работы с Python, вам может быть интересно, как это объект может быть глобальным и как Flask удается по-прежнему быть потокобезопасными. ответ - это локали контекста...

Теперь я понял, что локаторы контекста являются такими, как оператор with (конечно, это то, что предлагает python 2.6 doc). Я пытаюсь понять, как это позволит вам иметь глобально доступные вары, которые находятся в локальном пространстве имен? Как это концептуально работает?

Также: глобалы, как правило, считаются грязными, я беру их, так почему это так?

4b9b3361

Ответ 1

Они на самом деле являются прокси-объектами для реальных объектов, поэтому при обращении к ним вы получаете доступ к объекту для текущего потока.

Примером может служить объект request. Вы можете видеть, что это настроено в globlals.py, а затем импортировано в __init__.py для фляжки.

Преимущество этого в том, что вы можете получить доступ к запросу, просто выполнив

from flask import request

и написать такие методы, как

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

без необходимости передавать запрос в качестве параметра.

Это использует некоторые библиотеки многократного использования из Werkzeug.

Ответ 2

пространства имен в python - это в основном словари вы могли бы сделать

globals()['foo']=bar