将 flask-mail 与应用程序工厂一起使用 - 将邮件属性添加到应用程序对象
Using flask-mail with an application factory - adding mail attribute to app object
我正在使用具有应用程序工厂设计模式的 Flask 构建应用程序。我想在我的一个视图中使用 Flask-Mail,它通过蓝图注册到应用程序。
我从这个 问题中了解到,您应该像这样在 create_app() 函数之外实例化 Mail() 对象:
from flask_mail import Mail
mail = Mail()
def create_app(config_lvl):
# stuff
mail.init_app(app)
# more stuff
return app
然后您可以将邮件对象导入您的视图文件并从那里访问它。
然而,要使其正常工作,您需要确保在 __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 send_email(to, subject, template):
msg = Message(
subject,
recipients=[to],
html=template,
sender=current_app.config['MAIL_DEFAULT_SENDER']
)
current_app.mail.send(msg)
这感觉像是一种在整个应用程序中访问邮件客户端的更简单方法,而不是为了确保导入各种内容的顺序正确无误。
我想要的是有人告诉我为什么这不是一个好主意。
对我来说,正确的做法是定义一个包含 flask-extensions 实例的扩展文件,例如 Mail。在extensions.py
from flask-mail import Mail
mail = Mail()
然后从您的 create_app 函数调用您的邮件。
from extension import mail
def create_app(config_lvl):
mail.init_app(app)
return app
之后您可以在所有项目中调用 extensions.py 中的邮件变量。
我正在使用具有应用程序工厂设计模式的 Flask 构建应用程序。我想在我的一个视图中使用 Flask-Mail,它通过蓝图注册到应用程序。
我从这个
from flask_mail import Mail
mail = Mail()
def create_app(config_lvl):
# stuff
mail.init_app(app)
# more stuff
return app
然后您可以将邮件对象导入您的视图文件并从那里访问它。
然而,要使其正常工作,您需要确保在 __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 send_email(to, subject, template):
msg = Message(
subject,
recipients=[to],
html=template,
sender=current_app.config['MAIL_DEFAULT_SENDER']
)
current_app.mail.send(msg)
这感觉像是一种在整个应用程序中访问邮件客户端的更简单方法,而不是为了确保导入各种内容的顺序正确无误。
我想要的是有人告诉我为什么这不是一个好主意。
对我来说,正确的做法是定义一个包含 flask-extensions 实例的扩展文件,例如 Mail。在extensions.py
from flask-mail import Mail
mail = Mail()
然后从您的 create_app 函数调用您的邮件。
from extension import mail
def create_app(config_lvl):
mail.init_app(app)
return app
之后您可以在所有项目中调用 extensions.py 中的邮件变量。