西芹碎瓶

2024-10-01 09:28:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个烧瓶应用程序,芹菜可以正常工作,烧瓶邮件本身也可以。在

from celery import Celery
from flask_mail import Mail, Message
app = Flask(__name__)
mail = Mail(app)

celery = Celery('main_app', 
                 broker='mongodb://localhost',
                 backend='mongodb://localhost')
@celery.task
def cel_test():
     return 'cel_test'

@app.route('/works_maybe')
def works_maybe():
    return cel_test.delay()

到目前为止,还不错

celéu test和芹菜工人配合得很好;所有东西都显示在mongo中。在

但这里就变得奇怪了。“signup”plus mail方法在没有@celery.task的情况下100%工作,但是当它成为一个任务时就会崩溃。在

^{pr2}$

痕迹

R = retval = fun(*args, **kwargs)
File "/Users/username/pymods/virtualenvs/directory/lib/python2.7/site-packages/celery-3.0.15-py2.7.egg/celery/task/trace.py", line 415, in __protected_call__
return self.run(*args, **kwargs)
File "/Users/username/pymods/directory/directory/main_app/main_app.py", line 43, in send_email
something = 'a string in the Message'),
File "/Users/username/pymods/virtualenvs/directory/lib/python2.7/site-packages/flask/templating.py", line 123, in render_template
ctx.app.update_template_context(context)  
AttributeError: 'NoneType' object has no attribute 'app'

有人能解释一下为什么芹菜很管用,但当我涉及到邮件.发送(msg)坏了?在

也许在python中还有一些东西我需要学习?在

如果有任何想法,至少是关于如何处理这类问题,我们将不胜感激。在


Tags: intestapptaskreturnmainusernamemail
2条回答

在flask中做的很多事情都绑定到应用程序上下文。例如,render_template函数,它需要知道应用程序将其模板存储在何处。session变量想知道应用程序的数据存储或缓存系统。调用request对象和您的mail.send需要一些应用程序上下文。在

如果您想在flask应用程序的范围之外调用它们,比如在celery任务中,请在应用程序上下文中这样做:

...

with app.app_context():

    do_some_context_bound_actions()

    msg = Messgae(...)
    user_name = app.session["user"].name
    msg.html = render_template("mail/welcome.html", name=user_name)
    mail.send(msg)

...

更新

该错误位于send_email任务的render_template部分。在

@celery.task
def send_email(some_arg, name, email):
    msg = Message(
                  subject='hello', 
                  body=render_template('email.txt',
                  name=name, 
                  some_arg=some_arg),
                  recipients=[email]
                 )
    return mail.send(msg)

当我删除body=render_templatekablaam时,它就起作用了。在

我有from flask import render_template。也许render_template不能这样工作?在

奇怪的是,没有芹菜,send_email加上{}效果很好。在

卑鄙的成功

当我用另一个函数强制app_context时,一切都正常:

^{pr2}$

然后把它扔到send_email任务中,所以

body = render_template('email.txt'…

变成

body= create_email(some_arg, name)

我们就可以自由回家了。在

相关问题 更多 >