Как контекстные локальные элементы и контекст запроса работают вместе? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь научиться делать переменную доступной через метод с помощью функции декоратора во Flask.

Я прочитал Контекстную документацию запроса Flask и написал следующий код, который работает как задумано.

a.py

_request_ctx_stack.top.current_identity = payload.get('sub')

b.py

current_identity = getattr(_request_ctx_stack.top, 'current_identity', None)

Однако flask-jwt решает эту проблему путем введения дополнительного local proxyвот так:

a.py

from werkzeug.local import LocalProxy

current_identity = LocalProxy(lambda: getattr(_request_ctx_stack.top, 'current_identity', None))
_request_ctx_stack.top.current_identity = payload.get('sub')

b.py

from a import current_identity

Почему?Я прочитал документацию о локальных контекстных контекстах werkzeug и разве Flask уже не реализует локальные контекстные контексты Werkzeug для объекта запроса?

Есть ли преимущество от введения LocalProxy?

1 Ответ

0 голосов
/ 14 мая 2019

LocalProxy оборачивает ручной код, который вы написали для получения значения.Вместо того, чтобы нуждаться в ручном коде везде, где вы хотите получить доступ к current_identity, вы обращаетесь к нему как к прокси-серверу, и он делает ручной код для вас.

Это наиболее полезно в библиотеках, где пользователи не ожидаютзнать, как настроен current_identity, и импортировать прокси для доступа к нему.То же самое относится и к самой Flask: вы не должны знать, как настроен запрос или где именно он хранится, только к тому, что вы обращаетесь к нему путем импорта request.

Прокси-сервер полезен для данныхэто настраивается во время и локально для каждого запроса.Если вы используете истинную глобальную переменную, она не будет вести себя так, как вы ожидаете, когда обрабатывается несколько запросов.См. Являются ли глобальные переменные безопасными в потокеКак я могу делиться данными между запросами?

...