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.