Tôi đang xây dựng một trang web bằng cách sử dụng Flask Flask. Mọi thứ đang diễn ra tốt đẹp và bây giờ tôi đang cố gắng thực hiện cần tây.Bình Flask với cần tây trong bối cảnh ứng dụng
Điều đó cũng tốt cho đến khi tôi cố gửi email bằng bình cầu từ cần tây. Bây giờ tôi nhận được một lỗi "làm việc bên ngoài bối cảnh ứng dụng".
đầy đủ traceback là
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
Đây là chức năng mail của tôi:
@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)
Đây là tập tin cần tây của tôi:
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 là flask_mail ví dụ. thư được bắt đầu từ một tệp khác khi ứng dụng được bắt đầu. – Spuds
Tôi không biết giải pháp nào sẽ tốt hơn, thêm ngữ cảnh vào toàn bộ ứng dụng cần tây hoặc chỉ gọi hàm gọi lại. Nhưng bạn có thể đọc tất cả về ngữ cảnh ứng dụng Flask tại http://flask.pocoo.org/docs/appcontext/ –