python - 将 Flask-mail 与应用程序工厂一起使用 - 将邮件属性添加到应用程序对象

标签 python flask flask-mail

我正在使用带有应用程序工厂设计模式的 Flask 构建应用程序。我想在通过蓝图注册到应用程序的 View 之一中使用 Flask-Mail。

我从这个看到Flask - cannot use Flask and Flask-mail instances 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

然后您可以将邮件对象导入您的 View 文件并从那里访问它。

但是,要使其正常工作,您需要确保 __init__.py 中的邮件对象。在您导入包含使用邮件对象的 View 的蓝图之前实例化您的应用程序。如果不这样做,则会出现导入错误。

对我来说,这感觉很糟糕,虽然 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)

这感觉像是在整个应用程序中访问邮件客户端的一种更简单的方法,而不是确保您导入各种内容的顺序正确无误。

我想要的是有人告诉我为什么这不是一个好主意。

最佳答案

对我来说,正确的做法是定义一个扩展文件,其中包含像 Mail 这样的 flask 扩展的实例。在扩展名.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 调用您的邮件变量。

关于python - 将 Flask-mail 与应用程序工厂一起使用 - 将邮件属性添加到应用程序对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57105644/

相关文章:

python - 如何捕获 SMTPRecipientsRefused 异常(使用远程 SMTP 服务器和 django)?

python - 转义包含 '\xae' 元素的列表并打印结果

python - 在 Flask 中执行 POST 时保存 GET URI

python - 尝试使用 Flask-Mail 发送消息时未添加收件人

python - 异步使用 Flask-Mail 导致 "RuntimeError: working outside of application context"

python - 由于在 Mac OS X 上 brew install gcc 后缺少 fortran 编译器,仍然无法安装 scipy

python - 您如何检查小部件是否在 Tkinter 中具有焦点?

python - 难以在 Flask 的模板文件夹中将外部 CSS 和 bootstrap 文件包含在 HTML 中

python - 如何设置 Flask 蓝图以允许匿名访问?

python - 操作系统错误 : [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions