2013-02-23 2 views
2

셀러리가 잘 작동하고 Flask-Mail이 잘 작동하는 플라스크 응용 프로그램도 있습니다.Flask-Mail breaks Celery

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는 셀러리 노동자와 함께 잘 작동; 모든 것이 몽고에 나타납니다.

하지만 여기가 이상해집니다. "가입"플러스 메일 방법은 @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' 

사람이 왜 한 경우 셀러리에가 잘 작동하지만 mail.send을 포함하는 경우 (MSG)가 고장 설명 할 수있는 TRACE?

아마 내가 파이썬으로 더 일반적으로 배울 필요가있는 것이 있습니까?

적어도 이런 유형의 문제에 접근하는 것이 좋으면 크게 생각해보십시오.

+0

'app = Flask (__ name__) 셀러리 = 셀러리 (__ name__) celery.conf.add_defaults (app.config)'를 사용 하시겠습니까? – Joe

+0

좋아, 우리는 어딘가에있다. 이제 작업자가 다음을 제기합니다 :'[2013-02-23 15 : 59 : 52,093 : ERROR/MainProcess] '__main __. send_email'형식의 등록되지 않은 작업을 수신했습니다. KeyError : '__main __. send_email''Print Celery .tasks'는'<@task : __main __. send_email>'아마도 * 등록 된 것을 의미합니다. – Stuart

답변

0

업데이트

버그는 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_template 제거

, kablaam, 그것은 작동합니다.

나는 from flask import render_template이 있습니다. 아마 render_template이 작동하지 않을 수 있습니까?

이상하게도 없이 셀러리, send_email 더하기 render_template이 적합합니다.

Hackish 성공

내가 다른 함수의 모든 것을 함께 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) 

하고 그래서

body = render_template('email.txt'… 

body= create_email(some_arg, name) 
이되는 send_email 작업에 던져

그리고 우리는 집에 돌아 왔습니다.

+0

msg 객체를 매개 변수로 보낼 수도 있습니다. 그러나 재 시도를 사용하여 나중에 전자 메일을 보내지 마십시오. 예를 들어 연결이 끊어지는 등의 문제가 발생할 때 전자 메일을 다시 보냅니다. –