我正在用python Flask建立一个网站。一切都很顺利,现在我正努力实施芹菜。
那也很顺利,直到我试着用一瓶芹菜邮件发邮件。现在我收到一个“在应用程序上下文之外工作”错误。
完全回溯是
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/celery/task/trace.py", line 228, in trace_task
R = retval = fun(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/celery/task/trace.py", line 415, in __protected_call__
return self.run(*args, **kwargs)
File "/home/ryan/www/CG-Website/src/util/mail.py", line 28, in send_forgot_email
msg = Message("Recover your Crusade Gaming Account")
File "/usr/lib/python2.7/site-packages/flask_mail.py", line 178, in __init__
sender = current_app.config.get("DEFAULT_MAIL_SENDER")
File "/usr/lib/python2.7/site-packages/werkzeug/local.py", line 336, in __getattr__
return getattr(self._get_current_object(), name)
File "/usr/lib/python2.7/site-packages/werkzeug/local.py", line 295, in _get_current_object
return self.__local()
File "/usr/lib/python2.7/site-packages/flask/globals.py", line 26, in _find_app
raise RuntimeError('working outside of application context')
RuntimeError: working outside of application context
这是我的邮件功能:
@celery.task
def send_forgot_email(email, ref):
global mail
msg = Message("Recover your Crusade Gaming Account")
msg.recipients = [email]
msg.sender = "Crusade Gaming stuff@cg.com"
msg.html = \
"""
Hello Person,<br/>
You have requested your password be reset. <a href="{0}" >Click here recover your account</a> or copy and paste this link in to your browser: {0} <br />
If you did not request that your password be reset, please ignore this.
""".format(url_for('account.forgot', ref=ref, _external=True))
mail.send(msg)
这是我的芹菜档案:
from __future__ import absolute_import
from celery import Celery
celery = Celery('src.tasks',
broker='amqp://',
include=['src.util.mail'])
if __name__ == "__main__":
celery.start()
下面是一个解决方案,它可以使用flask应用程序工厂模式,还可以创建带有上下文的芹菜任务,而无需使用
app.app_context()
。在避免循环导入的同时获得该应用程序确实很难,但这解决了问题。这是为芹菜4.2这是最新的时候写的。结构:
因此
base
是本例中的主要应用程序包。在base/__init__.py
中,我们创建芹菜实例,如下所示:base/app.py
文件包含烧瓶应用程序工厂create_app
,并注意它包含的init_celery(app, celery)
:转到
base/runcelery.py
内容:接下来,
base/celeryconfig.py
文件(作为示例):现在在
base/utility/celery_util.py
文件中定义init芹菜:对于
base/tasks/workers.py
中的工人:然后,您需要在
repo_name
文件夹中的两个不同的命令提示中启动芹菜节拍和芹菜工人。在一个命令提示符下执行
celery -A base.runcelery:celery beat
,另一个命令提示符下执行celery -A base.runcelery:celery worker
。然后,运行需要flask上下文的任务。应该有用。
Flask邮件需要Flask应用程序上下文才能正常工作。在芹菜端实例化app对象并使用app.app_上下文,如下所示:
在mail.py文件中,导入“app”和“mail”对象。然后,使用请求上下文。做这样的事:
相关问题 更多 >
编程相关推荐