我正在使用 Flask 和应用程序工厂设计模式构建一个应用程序。我想在我的一个视图中使用 Flask-Mail,该视图通过蓝图注册到应用程序。
我从这个Flask - Cannot use Flask and Flask-mailInstances from other files问题中看到,您应该在 create_app() 函数之外实例化 Mail() 对象,如下所示:
from flask_mail import Mail
mail = Mail()
def create_app(config_lvl):
# stuff
mail.init_app(app)
# more stuff
return app
Run Code Online (Sandbox Code Playgroud)
然后,您可以将邮件对象导入到视图文件中并从那里访问它。
但是,要使其正常工作,您需要确保在导入包含使用邮件对象的视图的蓝图之前__init__.py实例化应用程序中的邮件对象。如果不这样做,您会收到导入错误。
对我来说,这感觉很奇怪,尽管 Flask 通常似乎对这类事情很满意,但我希望应用程序工厂设计模式能够最大限度地减少这种导入的麻烦。
我的解决方案是将邮件客户端附加到应用程序对象,以便可以从其他任何地方访问它,current_app.mail如下所示:
## __init.py __ ##
from flask_mail import Mail
def create_app(config_lvl):
# stuff
app.mail = Mail(app)
# more stuff
return app
## views.py ##
from flask_mail import Message
from flask import current_app
def …Run Code Online (Sandbox Code Playgroud)