Ich baue eine Website mit Python Flask. Alles läuft gut und jetzt versuche ich Sellerie zu implementieren.Python Flask mit Sellerie außerhalb der Anwendung Kontext
Das lief auch gut, bis ich versuchte, eine E-Mail mit Flaschenpost aus Sellerie zu senden. Jetzt bekomme ich einen Fehler "außerhalb des Anwendungskontexts arbeiten".
vollständige Rückverfolgung ist
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/celery/task/trace.py", line 228, in trace_task
R = retval = fun(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/celery/task/trace.py", line 415, in __protected_call__
return self.run(*args, **kwargs)
File "/home/ryan/www/CG-Website/src/util/mail.py", line 28, in send_forgot_email
msg = Message("Recover your Crusade Gaming Account")
File "/usr/lib/python2.7/site-packages/flask_mail.py", line 178, in __init__
sender = current_app.config.get("DEFAULT_MAIL_SENDER")
File "/usr/lib/python2.7/site-packages/werkzeug/local.py", line 336, in __getattr__
return getattr(self._get_current_object(), name)
File "/usr/lib/python2.7/site-packages/werkzeug/local.py", line 295, in _get_current_object
return self.__local()
File "/usr/lib/python2.7/site-packages/flask/globals.py", line 26, in _find_app
raise RuntimeError('working outside of application context')
RuntimeError: working outside of application context
Diese meine Mail-Funktion ist:
@celery.task
def send_forgot_email(email, ref):
global mail
msg = Message("Recover your Crusade Gaming Account")
msg.recipients = [email]
msg.sender = "Crusade Gaming [email protected]"
msg.html = \
"""
Hello Person,<br/>
You have requested your password be reset. <a href="{0}" >Click here recover your account</a> or copy and paste this link in to your browser: {0} <br />
If you did not request that your password be reset, please ignore this.
""".format(url_for('account.forgot', ref=ref, _external=True))
mail.send(msg)
Das ist mein Sellerie-Datei:
from __future__ import absolute_import
from celery import Celery
celery = Celery('src.tasks',
broker='amqp://',
include=['src.util.mail'])
if __name__ == "__main__":
celery.start()
Mail ist der flask_mail finden Beispiel. Mail wird beim Starten der App aus einer anderen Datei initiiert. – Spuds
Ich weiß nicht, welche Lösung besser wäre, indem ich den Kontext der gesamten Sellerie-Anwendungsinstanz oder nur der Callback-Funktion hinzufüge. Aber Sie können alles über den Flask Application Context lesen unter http://flask.pooco.org/docs/appcontext/ –