script library enviar con adjunto python python-2.7 flask celery celery-task

python - library - Enviar tarea de correo electrónico con el contexto correcto



send email python gmail (1)

Este código es mi script de apio trabajador:

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

Cuando intento ejecutar al trabajador entraré en este error:

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

Mi pregunta es cómo puedo enviar la tarea de correo electrónico cuando utilizo un trabajador en apio.

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)

__en eso__

... 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

Aparentemente hay un conflicto entre el plan y el trabajador. Eliminar el blueprint no es una opción, si es posible, debido a los filtros personalizados que necesito usar en la plantilla de correo electrónico.


Finalmente encontré cuál es la razón del problema después de algunas depuraciones con este código .

Tengo un app_context_processor que no devolverá ningún resultado.

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

Al enviar el correo electrónico, el current_user necesitará un caso else para devolver algo, ya que el from flask.ext.login import current_user no está definido. Básicamente solo necesito algo como esto.

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

Entonces, el problema no está relacionado con el apio, sino con la integración del inicio de sesión del matraz.