RuntimeError (_app_ctx_err_msg): работа вне контекста приложения при отправке почты из потока - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь отправить электронное письмо, используя флеш-почту, и вот фрагмент кода, который я должен использовать для отправки почты

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

def send_email(subject, recipients, text_body=None, html_body=None):
    msg = Message(subject, recipients=recipients)
    msg.body = text_body
    msg.html = html_body
    thr = Thread(target=send_async_email, args=[current_app, msg])
    thr.start()

При выполнении этого кода я получаю следующую ошибку

Exception in thread Thread-9:
Traceback (most recent call last):
  File "C:\Python37\lib\threading.py", line 917, in _bootstrap_inner
    self.run()
  File "C:\Python37\lib\threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "..\flask_demo\flaskdemo\common_utils.py", line 7, in send_async_email
    with app.app_context():
  File "..\flask_demo\venv\lib\site-packages\werkzeug\local.py", line 348, in __getattr__
    return getattr(self._get_current_object(), name)
  File "..\flask_demo\venv\lib\site-packages\werkzeug\local.py", line 307, in _get_current_object
    return self.__local()
  File "..\flask_demo\venv\lib\site-packages\flask\globals.py", line 51, in _find_app
    raise RuntimeError(_app_ctx_err_msg)
RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that needed
to interface with the current application object in some way. To solve
this, set up an application context with app.app_context().  See the
documentation for more information.

1 Ответ

0 голосов
/ 29 марта 2019

После отладки я обнаружил, что проблема связана с «current_app», это локальное значение потока, когда вы передаете его в __process, мы не передаем фактический объект приложения.

Это можно решить с помощью прокси, используйте current_app._get_current_object ().Больше информации на http://flask.pocoo.org/docs/1.0/reqcontext/#notes-on-proxies

Теперь код выглядит следующим образом

def send_email(subject, recipients, text_body=None, html_body=None):
    msg = Message(subject, recipients=recipients)
    msg.body = text_body
    msg.html = html_body
    app = current_app._get_current_object()
    thr = Thread(target=send_async_email, args=[app, msg])
    thr.start()
...