2015-12-04 17 views
14

Ten kod jest mój skrypt pracownik seler:Wyślij zadanie e-mail z właściwym kontekście

from app import celery, create_app 
app = create_app('default') 
app.app_context().push() 

Kiedy próbuję uruchomić pracownika będę się do tego błędu:

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 

Moje pytanie brzmi: w jaki sposób Wysyłam zadanie mailowe, gdy korzystam z pracownika w selerze.

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 

Podobno istnieje jakiś konflikt między planem i pracownika. Usuń plan, jeśli to możliwe, nie jest opcją ze względu na niestandardowe filtry, których potrzebuję w szablonie wiadomości e-mail.

+0

Nie podążam za tym rozumowaniem. Czy chcesz, aby pracownik selera zarejestrował projekt? Brzmi dla mnie wstecz, spodziewałbym się, że plan zarejestruję zadania selera, a nie na odwrót. Czy mógłbyś wyjaśnić, co plan ma robić i co powinien zrobić pracownik selerów? –

+0

również, co jest w twoim szablonie? – user3012759

+0

@ user3012759 nawet z pustym szablonem (tylko do debugowania), otrzymam błąd. Więc problem nie jest szablonem. – anvd

Odpowiedz

9

W końcu znalazłem przyczynę problemu po debugowaniu z tym code.

Mam app_context_processor, który nie zwróci żadnego wyniku.

@mod.app_context_processor 
def last_reputation_changes(): 
    if current_user: 
     #code 
     return dict(reputation='xxx') 

Wysyłając e-mail current_user będzie potrzebował else sprawy powrócić coś, ponieważ current_user od from flask.ext.login import current_user nie jest zdefiniowana. Zasadniczo potrzebuję tylko czegoś takiego.

def last_reputation_changes(): 
    if current_user: 
     #code 
     return dict(reputation='xxx') 
    else: 
     return dict(reputation=None) 

Problem nie jest związany z selerem, ale z integracją z flaksem.