发送具有正确上下文的电子邮件任务
Send email task with correct context
这段代码是我的 celery worker 脚本:
from app import celery, create_app
app = create_app('default')
app.app_context().push()
当我尝试 运行 工作人员时,我会遇到此错误:
File "/home/vagrant/myproject/venv/app/mymail.py", line 29, in send_email_celery
msg.html = render_template(template + '.html', **kwargs)
File "/home/vagrant/myproject/venv/local/lib/python2.7/site-packages/flask/templating.py", line 126, in render_template
ctx.app.update_template_context(context)
File "/home/vagrant/myproject/venv/local/lib/python2.7/site-packages/flask/app.py", line 716, in update_template_context
context.update(func())
TypeError: 'NoneType' object is not iterable
我的问题是在 celery 中使用 worker 时如何发送电子邮件任务。
mymail.py
from flask import current_app, render_template
from flask.ext.mail import Message
from . import mail, celery
@celery.task
def send_async_email_celery(msg):
mail.send(msg)
def send_email_celery(to, subject, template, **kwargs):
app = current_app._get_current_object()
msg = Message(subject, sender=app.config['MAIL_SENDER'], recipients=[to])
msg.html = render_template(template + '.html', **kwargs)
send_async_email_celery.delay(msg)
__init__
...
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
bootstrap.init_app(app)
mail.init_app(app)
db.init_app(app)
login_manager.init_app(app)
celery.conf.update(app.config)
redis_store.init_app(app)
from .users import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
显然蓝图和工人之间存在一些冲突。删除蓝图不是一个选项,如果可能的话,因为我需要在电子邮件模板中使用自定义过滤器。
经过一些调试后终于找到了问题的原因code。
我有一个 app_context_processor
不会 return 任何结果。
@mod.app_context_processor
def last_reputation_changes():
if current_user:
#code
return dict(reputation='xxx')
发送电子邮件时,current_user
将需要一个 else
案例到 return 某物,因为未定义来自 from flask.ext.login import current_user
的 current_user
。基本上我只需要这样的东西。
def last_reputation_changes():
if current_user:
#code
return dict(reputation='xxx')
else:
return dict(reputation=None)
所以问题与芹菜无关,而是与烧瓶登录集成有关。
这段代码是我的 celery worker 脚本:
from app import celery, create_app
app = create_app('default')
app.app_context().push()
当我尝试 运行 工作人员时,我会遇到此错误:
File "/home/vagrant/myproject/venv/app/mymail.py", line 29, in send_email_celery
msg.html = render_template(template + '.html', **kwargs)
File "/home/vagrant/myproject/venv/local/lib/python2.7/site-packages/flask/templating.py", line 126, in render_template
ctx.app.update_template_context(context)
File "/home/vagrant/myproject/venv/local/lib/python2.7/site-packages/flask/app.py", line 716, in update_template_context
context.update(func())
TypeError: 'NoneType' object is not iterable
我的问题是在 celery 中使用 worker 时如何发送电子邮件任务。
mymail.py
from flask import current_app, render_template
from flask.ext.mail import Message
from . import mail, celery
@celery.task
def send_async_email_celery(msg):
mail.send(msg)
def send_email_celery(to, subject, template, **kwargs):
app = current_app._get_current_object()
msg = Message(subject, sender=app.config['MAIL_SENDER'], recipients=[to])
msg.html = render_template(template + '.html', **kwargs)
send_async_email_celery.delay(msg)
__init__
...
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
bootstrap.init_app(app)
mail.init_app(app)
db.init_app(app)
login_manager.init_app(app)
celery.conf.update(app.config)
redis_store.init_app(app)
from .users import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
显然蓝图和工人之间存在一些冲突。删除蓝图不是一个选项,如果可能的话,因为我需要在电子邮件模板中使用自定义过滤器。
经过一些调试后终于找到了问题的原因code。
我有一个 app_context_processor
不会 return 任何结果。
@mod.app_context_processor
def last_reputation_changes():
if current_user:
#code
return dict(reputation='xxx')
发送电子邮件时,current_user
将需要一个 else
案例到 return 某物,因为未定义来自 from flask.ext.login import current_user
的 current_user
。基本上我只需要这样的东西。
def last_reputation_changes():
if current_user:
#code
return dict(reputation='xxx')
else:
return dict(reputation=None)
所以问题与芹菜无关,而是与烧瓶登录集成有关。