【发布时间】:2020-09-26 05:05:51
【问题描述】:
我有一个关于 Flask 应用程序工厂模式的简单概念性问题。
我正在尝试跨不同文件使用 Flask-Mail。我的__init__.py 文件是:
#
# __init__.py
#
from flask import Flask
from flask_pymongo import PyMongo
from flask_mail import Mail
from flask_login import LoginManager
mail = Mail()
mongo = PyMongo()
login_manager = LoginManager()
def create_app():
app = Flask(__name__, instance_relative_config=False)
app.config.from_object('config.DevConfig')
mail.init_app(app)
login_manager.init_app(app)
mongo.init_app(app, retryWrites = False)
with app.app_context():
from .views import bp
app.register_blueprint(views.bp)
return app
还有另一个文件:
#
# views.py
#
from flask import Blueprint
from flask import current_app as app
from flask_mail import Message
from app import mongo, mail, login_manager
bp = Blueprint('bp', __name__, template_folder='templates', static_folder='static')
@bp.route('/')
def index():
msg = Message("Success", recipients=[ email ])
with open('template.html', 'r') as fd:
msg.html = fd.read()
mail.send(msg)
虽然我在我的配置文件中设置了MAIL_DEFAULT_SENDER,但在点击views.py 中的mail.send(msg) 行时,我收到了没有指定默认发件人的错误。检查mail 对象后,我看到它没有设置配置变量。
Per this tutorial,似乎我需要在此模式下使用mail 对象时手动设置current_app.config['MAIL_DEFAULT_SENDER'],并且需要在mail 对象周围编写一个额外的with app.app_context(): 块,这样它是用正确的配置变量实例化的。
这似乎需要做很多额外的工作,那么有没有另一种方法可以直接获取在 create_app 中初始化并设置了所有正确配置变量的 mail 对象?
感谢您的帮助!
编辑:
创建extensions.py:
from flask_pymongo import PyMongo
from flask_mail import Mail
from flask_login import LoginManager
mail = Mail()
mongo = PyMongo()
login_manager = LoginManager()
并将__init__.py修改为:
from flask import Flask
def create_app():
app = Flask(__name__, instance_relative_config=False)
app.config.from_object('config.DevConfig')
from app.extensions import mail, login_manager, mongo
mail.init_app(app)
login_manager.init_app(app)
mongo.init_app(app, retryWrites = False)
with app.app_context():
from .views import bp
app.register_blueprint(views.bp)
return app
对于views.py,我有:
from flask import Blueprint
from flask import current_app
from flask_mail import Message
from app.extensions import mongo, mail, login_manager
bp = Blueprint('bp', __name__, template_folder='templates', static_folder='static')
@bp.route('/')
def index():
msg = Message("Success", recipients=[ email ])
with open('template.html', 'r') as fd:
msg.html = fd.read()
mail.send(msg)
【问题讨论】:
标签: python flask flask-mail