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

Python 将flask mail与应用程序工厂一起使用-将邮件属性添加到应用程序对象,python,flask,flask-mail,Python,Flask,Flask Mail,我正在使用Flask和应用程序工厂设计模式构建一个应用程序。我想在我的一个视图中使用Flask Mail,该视图通过蓝图注册到应用程序 我从这个问题中看到,您应该在create_app()函数之外实例化Mail()对象,如下所示: 从flask\u邮件导入邮件 mail=mail() def创建应用程序(配置层): #东西 mail.init_应用程序(应用程序) #更多的东西 返回应用程序 然后,您可以将邮件对象导入到视图文件中并从那里访问它 但是,要使其正常工作,您需要确保在导入包含使用邮

我正在使用Flask和应用程序工厂设计模式构建一个应用程序。我想在我的一个视图中使用Flask Mail,该视图通过蓝图注册到应用程序

我从这个问题中看到,您应该在create_app()函数之外实例化Mail()对象,如下所示:

从flask\u邮件导入邮件
mail=mail()
def创建应用程序(配置层):
#东西
mail.init_应用程序(应用程序)
#更多的东西
返回应用程序
然后,您可以将邮件对象导入到视图文件中并从那里访问它

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

对我来说,这感觉有点骇人听闻,尽管Flask经常对这类事情感到非常满意,但我希望应用程序工厂设计模式能够最大限度地减少这种进口把戏

我的解决方案是将邮件客户端连接到app对象,这样就可以使用
current\u app.mail
从任何其他地方访问它,就像这样:

###uu init.py\uu##
从电子邮件导入邮件
def创建应用程序(配置层):
#东西
app.mail=邮件(app)
#更多的东西
返回应用程序
##views.py##
从电子邮件导入消息
从flask导入当前应用程序
def发送电子邮件(收件人、主题、模板):
消息(
主题,,
收件人=[to],
html=模板,
sender=当前应用程序配置['MAIL\u DEFAULT\u sender']
)
当前_app.mail.send(msg)
这感觉像是在整个应用程序中访问邮件客户端的一种更简单的方法,而不是为了确保导入各种内容的顺序是正确的而东拉西扯


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

对我来说,正确的方法是定义一个扩展文件,其中包含诸如Mail之类的flask扩展实例。在extensions.py中

from flask-mail import Mail
mail = Mail()
并从您的创建应用程序功能调用您的邮件

from extension import mail

def create_app(config_lvl):
    mail.init_app(app)
    return app

之后,您可以在所有项目中从extensions.py调用mail变量。

感谢您的回复!对我来说,你的解决方案似乎也很明智。看来这只是一个偏好的例子,那么?我认为你的方法有一些局限性,比如你怎么能在flask的上下文之外使用你的邮件?我不确定,但我认为它不会起作用。在我上面展示的代码中,我确信它是有效的。:)这是在回答你的问题吗?你是对的,只有当我能够访问当前的应用程序上下文时,我的方法才有效。实际上,我现在已经切换到了您的方法,因为我已经在我的应用程序中添加了一些新的扩展(flask迁移、flask登录),并将所有这些都放在extensions.py中,感觉这是一种干净利落的方式,并且与应用程序工厂设计模式配合得很好。我现在就接受你的回答,谢谢!