Объект Flask не имеет атрибута app_context - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь периодически отправлять электронные письма с помощью колбы, но я застрял с этой ошибкой: у объекта Flask нет атрибута app_context

def mail_periodic():
    print "sending mail at " +time.ctime()

    app = current_app._get_current_object()

    msg = Message("no-reply: Avantgarde.Rentals",
                  sender="avantgarde.rentals.noreply@gmail.com",
                  )

    msg.add_recipient('aladinne.k@gmail.com')

    msg.body = 'Email periodic '
    mail2 = Mail(app)
    with app.app_context():
        mail2.send(msg)
    print"email sent "

threading.Timer(5, mail_periodic).start()



@app.route('/startcronemailing')
def startcronemailing():
    try:
        mail_periodic()
    except Exception, exception:
            return exception.message
    return "crone mailing started"

исключение, которое я получил:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 801, in __bootstrap_inner
    self.run()
  File "C:\Python27\lib\threading.py", line 1073, in run
    self.function(*self.args, **self.kwargs)
  File "app.py", line 113, in mail_periodic
    host_link='http://' + request.host,
  File "C:\Python27\lib\site-packages\werkzeug\local.py", line 336, in __getattr__
    return getattr(self._get_current_object(), name)
  File "C:\Python27\lib\site-packages\werkzeug\local.py", line 295, in _get_current_object
    return self.__local()
  File "C:\Python27\lib\site-packages\flask\globals.py", line 19, in _lookup_object
    raise RuntimeError('working outside of request context')
RuntimeError: working outside of request context

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

1 Ответ

0 голосов
/ 30 мая 2018

Вы должны передать экземпляр приложения как аргументы.Если вы используете current_app._get_current_object() для получения экземпляра приложения внутри целевой функции, вы не получите нужное приложение в другом потоке.Например:

from threading import Thread

from flask import current_app
from flask_mail import Message

from bluelog.extensions import mail

def _send_async_mail(app, message):  # target function
    with app.app_context():
        mail.send(message)

def send_async_mail(subject, to, html):
    app = current_app._get_current_object()  # get the real app instance
    message = Message(subject, recipients=[to], html=html)
    thr = Thread(target=_send_async_mail, args=[app, message])  # pass app
    thr.start()
    return thr
...