Настройка экземпляра приложения Flask в конфигурацию - PullRequest
0 голосов
/ 22 сентября 2018

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

def create_app():
    app = Flask(__name__)
    app.config['app'] = app
    with app.app_context():
        configure_app(app)
        configure_blueprints(app)
        ...

Теперь app можно получить из другого модуля через current_app.config['app']

app = current_app.config['app']
with app.app_context():
    ...

Вот этов реальном примере:

from flask import current_app

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


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

Используя только current_app в аргументах Thread, я получаю сообщение об ошибке, говорящее, что я работаю вне контекста приложения.Использование current_app.config ['app'] работает, я просто хочу знать, есть ли другой способ или есть что-то не так с этим?

1 Ответ

0 голосов
/ 22 сентября 2018

Это потому, что current_app - это просто прокси для локального приложения потока.Это должно решить это:

app= current_app._get_current_object()

Это возвращает вас к исходному объекту приложения.Ваш пример конфигурации сработал, поскольку он также использует исходное приложение, а не прокси.

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

Thread(target=send_async_email, args=(app, msg)).start()

Токак говорится, плохая идея устанавливать ваше приложение как элемент вашего app.config, так как оно рекурсивное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...