Skip to main content
 首页 » 编程设计

python之Flask-Mail 破坏 Celery

2025年05月04日13sky-heaven

我有一个 Flask 应用程序,其中 celery 运行良好,Flask-Mail 本身也运行良好。

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_test 与 celery worker 配合得很好;一切都显示在 mongo 中。

但这就是它变得奇怪的地方。 “注册”加邮件方法在没有 @celery.task 的情况下 100% 有效,但当它成为任务时就会崩溃。

@celery.task 
def send_email(some_arg, name, email): 
    msg = Message(…message details..) 
    return mail.send(msg) 
 
@app.route("/signup", methods=['POST']) 
def signup(): 
    return send_email.delay(...stuff for the message…) 

痕迹

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' 

有人可以解释为什么在一种情况下 celery 效果很好,但当我涉及 mail.send(msg) 时它会中断吗?

也许我需要更广泛地学习 python 的一些东西?

任何想法,如果至少是关于解决此类问题的方法,我们将不胜感激。

请您参考如下方法:

很多在flask中做的事情都是绑定(bind)到应用上下文的。例如,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) 
 
...