Несмотря на то, что рекомендации в ответах Дейва и Грега действительны, они упускают из виду то, что у вас есть неправильное понимание использования контекста приложения в задаче Celery.
У вас есть приложение Flask, вкоторый вы используете Flask-HTTPAuth.У вас, вероятно, есть обработчик verify_password
, который устанавливает g.user
для аутентифицированного пользователя.Это означает, что во время обработки запроса вы можете получить доступ к пользователю как g.user
.Это все хорошо.
У вас также есть один или несколько работников Celery, которые представляют собой отдельные процессы, не имеющие прямого подключения к серверу Flask.Единственный обмен данными между сервером Flask и рабочими процессами Celery происходит через используемый вами брокер сообщений (обычно Redis или RabbitMQ).
В зависимости от ваших потребностей работникам Celery может потребоваться доступ к Flask.приложение.Это очень часто встречается при использовании расширений Flask, которые сохраняют свою конфигурацию в словаре app.config
.Два распространенных расширения, которые требуют этого, - Flask-SQLAlchemy и Flask-Mail.Без доступа к app.config
задача Celery не сможет открыть соединение с базой данных или отправить электронное письмо, поскольку она не будет знать детали базы данных и / или почтового сервера.
КомуПредоставив работникам Celery доступ к конфигурации, принято создавать дубликаты приложений Flask для каждого работника.Это вторичные приложения, которые никак не связаны с реальным объектом приложения, используемым основным сервером Flask.Их единственная цель - хранить копию исходного словаря app.config
, к которому может получить доступ ваша задача или любые расширения Flask, используемые вашей задачей.
Таким образом, недопустимо ожидать, что набор g.user
на сервере Flask также будет доступен как g.user
в задаче Celery, просто потому, что это разные g
объекты из разных экземпляров приложения.
Если вам нужно использовать аутентифицированного пользователя в задаче Celeryчто вам нужно сделать, это передать user_id
(обычно g.user.id
) в качестве аргумента вашей задачи.Затем в своей задаче вы можете загрузить пользователя из базы данных, используя этот id
.Надеюсь, это поможет!