python - 异步使用 Flask-Mail 导致 "RuntimeError: working outside of application context"

标签 python flask python-multithreading flask-mail

我正在尝试异步发送一些邮件(基于 The Flask Mega-Tutorial, Part XI: Email Support 中的代码)。但是,关于在应用程序上下文之外工作,我收到以下错误。我该如何解决这个问题?

Traceback (most recent call last):
  File "C:\Users\Primoz\Desktop\RecycleFlaskServer\recycleserver\helpers.py", line 17, in send_async_email
    mail.send(msg)
  File "C:\Python33\lib\site-packages\flask_mail-0.9.0-py3.3.egg\flask_mail.py", line 434, in send
    message.send(connection)
  File "C:\Python33\lib\site-packages\flask_mail-0.9.0-py3.3.egg\flask_mail.py", line 369, in send
    connection.send(self)
  File "C:\Python33\lib\site-packages\flask_mail-0.9.0-py3.3.egg\flask_mail.py", line 173, in send
    email_dispatched.send(message, app=current_app._get_current_object())
  File "C:\Python33\lib\site-packages\werkzeug-0.9.4-py3.3.egg\werkzeug\local.py", line 297, in _get_current_object
    return self.__local()
  File "C:\Python33\lib\site-packages\flask-0.10.1-py3.3.egg\flask\globals.py", line 34, in _find_app
    raise RuntimeError('working outside of application context')
RuntimeError: working outside of application context
from flask import Flask
from flask.ext.mail import Mail
app = Flask(__name__)
app.config.from_object('recycleserver.settings')
mail = Mail(app)

def async(f):
    def wrapper(*args, **kwargs):
        thr = Thread(target = f, args = args, kwargs = kwargs)
        thr.start()
    return wrapper

@async
def send_async_email(msg):
    mail.send(msg)

def send_simple_mail(subject, sender, to_who, text_body="", html_body=""):
    msg = Message(subject=subject,sender=sender, recipients=to_who)
    msg.body = text_body
    msg.html = html_body
    send_async_email(msg)

最佳答案

代码应该在应用上下文中运行。添加与app.app_context():

 @async
 def send_async_email(msg):
    with app.app_context():
       mail.send(msg)

关于python - 异步使用 Flask-Mail 导致 "RuntimeError: working outside of application context",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21362700/

相关文章:

angularjs - 使用 Angular - Flask 将请求方法更改为 OPTIONS/CORS

python - 如何从尽可能快运行的 CherryPy BackgroundTask 返回数据

python - 在脱离主线程的异步事件循环中运行无限循环

python - DataFrame iterrows() 和 .to_csv : Writing row by row

python - 如何从 Jupyter Notebook 中的对象释放内存

python - 使用 TFRecord 数据进行训练和测试

python - TensorFlow REST 前端,但不是 TensorFlow Serving

python - 如何从 Flask 提供 create-react-app 服务?

python - C++ 中基本 Boost 使用的段错误

multithreading - Sublime Text 2 API 中的哪些操作是线程安全的?