Я новичок в библиотеке flask_login. В моей кодовой базе после входа пользователя я могу получить текущую информацию о пользователе из библиотеки current_user
из flask_login
. Упрощенный тестовый код приведен ниже:
from threading import Thread
from flask_login import current_user
def test():
print("current_user = ", current_user) # None
worker = Thread(target=test)
worker.start()
print("current_user = ", current_user) # <XXX.auth.view.User object at 0x119b2b250>
Поэтому меня очень смущает, почему я не могу получить текущую информацию о пользователе из отдельного потока, даже после того, как я намеренно снова импортирую перед первым оператором print
.
Спасибо.
current_user
— это локальное значение потока — оно будет вести себя как отдельная переменная в каждом потоке. Вы должны передавать его между потоками, если вам это нужно в другом месте.
Возможно, ваш звонок станет:
from threading import Thread
from flask_login import current_user
user = current_user
def test(user):
print("current_user = ", user)
worker = Thread(target=test, args=(user,))
worker.start()
print("current_user = ", user)
Соответствующая строка из источника flask_login
:
current_user = LocalProxy(lambda: _get_user())
Соответствующее обсуждение реализации werkzeug локальных жителей из документации werkzeug:
Werkzeug provides its own implementation of local data storage called werkzeug.local. This approach provides a similar functionality to thread locals but also works with greenlets.
https://werkzeug.palletsprojects.com/en/0.15.x/local/#werkzeug.local.LocalProxy
Я добавил потенциальное решение - хотя и не проверенное - дайте мне знать, если оно не сработает.
Причина, по которой я хочу получить текущего пользователя в новом потоке через from flask_login import current_user
, заключается в том, что у меня очень глубокий вложенный код, если я передам user
во вложенный код, это будет очень уродливо.
Это сложно - глубоко вложенный код обычно следует избегать по причинам, подобным вашей (Zen of Python, строка 5). Возможно, стоит провести рефакторинг, чтобы вернуться к плоской структуре.
Как я могу решить эту проблему, если я хочу получить текущего пользователя из
from flask_login import current_user
, есть ли способ?