2015-12-04 13 views
14

Mã này là kịch bản người lao động cần tây của tôi:Gửi nhiệm vụ email với bối cảnh đúng

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

Khi tôi cố gắng để chạy các công nhân tôi sẽ nhận được vào lỗi này:

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 

Câu hỏi của tôi là như thế nào có thể Tôi gửi tác vụ email, khi sử dụng một công nhân trong cần tây.

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 

Rõ ràng có một số mâu thuẫn giữa các kế hoạch chi tiết và người lao động. Loại bỏ kế hoạch chi tiết không phải là một tùy chọn, nếu có thể, do các bộ lọc tùy chỉnh mà tôi cần sử dụng trong mẫu email.

+0

Tôi không làm theo lý do tại đây. Bạn có muốn nhân viên cần tây đăng ký kế hoạch chi tiết không? Nghe ngược lại với tôi, tôi mong đợi một kế hoạch chi tiết để đăng ký các nhiệm vụ cần tây, không phải là cách khác. Bạn có thể giải thích kế hoạch chi tiết phải làm gì không và công nhân cần làm gì? –

+0

cũng có gì trong mẫu của bạn? – user3012759

+0

@ user3012759 ngay cả với mẫu trống (chỉ để gỡ lỗi), tôi sẽ gặp lỗi. Vì vậy, vấn đề không phải là mẫu. – anvd

Trả lời

9

Cuối cùng, tìm ra lý do của sự cố là gì sau khi gỡ lỗi với số code.

Tôi có một số app_context_processor sẽ không trả lại bất kỳ kết quả nào.

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

Khi gửi email current_user sẽ cần một trường hợp else trở về một cái gì đó, vì current_user từ from flask.ext.login import current_user không được định nghĩa. Về cơ bản tôi chỉ cần một cái gì đó như thế này.

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

Vì vậy, vấn đề không liên quan đến cần tây, nhưng với tích hợp đăng nhập bình.

Các vấn đề liên quan