Flask-Mail breaks Celery Flask-Mail breaks Celery flask flask

Flask-Mail breaks Celery


Update

The bug is in the render_template portion of the send_email task.

@celery.taskdef 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)

When I remove body=render_template, kablaam, it works.

I've got from flask import render_template. Perhaps render_template can't work like this?

Strangely, without Celery, the send_email plus render_template works perfect.

Hackish Success

When I force the app_context with another function everything works:

def create_email(some_arg, name, email):    with app.test_request_context('/send_email'):        return render_template('email.txt',                                 name=name,                                 some_arg=some_arg) 

and then toss it in the send_email task so

body = render_template('email.txt'

becomes

body= create_email(some_arg, name)

And we're home free.


A lot of things done in flask are bound to the application context. For example, the render_template function, it needs to know where your application stores its templates. The session variable wants to know your application's data store or caching system. The request object, and your mail.send require some application context when being called.

If you want to call them outside the scope of your flask application, like in your celery task, do it within the app context like so:

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