Flask_login, Как из нового потока получить current_user?

Я новичок в библиотеке 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.

Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
494
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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())

https://github.com/maxcountryman/flask-login/blob/d22f80d166ee260d44e0d2d9ea973b784ef3621b/flask_login/utils.py#L26


Соответствующее обсуждение реализации 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, есть ли способ?

leo 30.05.2019 15:15

Я добавил потенциальное решение - хотя и не проверенное - дайте мне знать, если оно не сработает.

Jay 30.05.2019 15:21

Причина, по которой я хочу получить текущего пользователя в новом потоке через from flask_login import current_user, заключается в том, что у меня очень глубокий вложенный код, если я передам user во вложенный код, это будет очень уродливо.

leo 30.05.2019 15:23

Это сложно - глубоко вложенный код обычно следует избегать по причинам, подобным вашей (Zen of Python, строка 5). Возможно, стоит провести рефакторинг, чтобы вернуться к плоской структуре.

Jay 30.05.2019 15:54

Другие вопросы по теме