烧瓶邮件打破芹菜 [英] Flask-Mail breaks Celery

查看:270
本文介绍了烧瓶邮件打破芹菜的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 我有一个Flask应用程序,在这里celery工作正常,Flask-Mail也可以正常工作。从celery进口Celery 
from flask_mail import邮件,消息
app = Flask(__ name__)
mail = Mail(app)
$ b $ 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():
返回cel_test.delay()



SO FAR,SO GOOD



cel_test对芹菜工作正常,一切都以mongo的形式出现。



但是这里有些奇怪。 注册加邮件方法在没有 @ celery.task 的情况下可以工作100%,但是当它成为一项任务时就会爆炸。

  @ celery.task 
def send_email(some_arg,name,email):
msg =消息(...消息详细信息..)
返回邮件.send(msg)

@ app.route(/ signup,methods = ['POST'])
def signup():
return send_email.delay(。 ...



THE TRACE



  R = retval = fun(* args,** kwargs)
文件/Users/username/pymods/virtualenvs/directory/lib/python2.7/site -packages / celery-3.0.15-py2.7.egg / celery / task / trace.py,第415行,在__protected_call__
返回self.run(* args,** kwargs)
文件/Users/username/pymods/directory/directory/main_app/main_app.py,第43行,在send_email
something ='Message'中的字符串),
文件/ Users / username / pymods / virtualenvs / directory / lib / python2.7 / site-packages / flask / templating.py,第123行,在render_template
ctx.app.update_template_context(context)
AttributeError:'NoneType'对象没有属性'app'

有人可以解释为什么在一个情况芹菜工作很好,但是当我涉及mail.send(味精)它打破?

也许有一些我需要更一般地学习Python?



任何想法,如果至少接近这种类型的问题将不胜感激。


错误发生在 send_email 的render_template部分。

/ code>任务。

  @ 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_template 时, kablaam ,它的工作原理。

我从flask导入render_template 得到了。也许 render_template 不能像这样工作?



奇怪的是,没有 Celery send_email 加上 render_template 完美。 / h1>

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

  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)

然后折腾 send_email 任务所以

  body = render_template('email.txt' ... 

变成

  body = create_email(some_arg,name)

我们是免费的。 / p>

I've got a Flask app where celery works fine and Flask-Mail on its own works fine as well.

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

SO FAR, SO GOOD

cel_test works fine with the celery worker; everything shows up in mongo.

But here's where it gets weird. The "signup" plus mail method works 100% without @celery.task, but blows up when it becomes a task.

@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…)

THE TRACE

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'

Could someone explain why in one case celery works great but when I involve mail.send(msg) it breaks?

Perhaps there is something I need to learn with python more generally?

Any thoughts, if at least as to approach to this type of issue would be greatly appreciated.

解决方案

Update

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

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

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.

这篇关于烧瓶邮件打破芹菜的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆