在 Flask 上注册用户后发送邮件时的循环导入问题
Circular import issue when working with sending mail upon user registration on Flask
我目前正在使用一个烧瓶应用程序,并试图在用户注册该网站后发送电子邮件。我在实例化应用程序的 main.py 和将数据提交到数据库并将密码通过电子邮件发回给用户的 data_inserts.py 之间进行循环导入时遇到困难。对于电子邮件功能,我使用 Flask-mail 扩展。我得到的错误如下:
ImportError: Cannot import name from 'DataInserts' from relevant_folder.data_inserts
详情如下:
main.py:
from relevant_folder.data_inserts import DataInserts
from flask import Flask
from flask_mail import Mail
from conf.mail_settings.py import mail_settings
app = Flask(__name__)
app.config.update[mail_settings]
mail = Mail(app)
@app.route("/register")
def register():
params = request.json
DataInserts.add_user(params)
relevant_folder.data_inserts.py:
from main import app
from main.app import mail
from flask_mail import message
class DataInserts():
def add_user(self, new_user_json):
''' add user name and email to db logic goes here'''
msg = Message(subject="Subject",
sender=app.config.get("MAIL_USERNAME"),
recipients=[new_user_json["email"]],
body="Hello " + new_user_json["name"] + ", your password is password")
mail.send(msg)
我觉得我的应用程序结构不正确。非常感谢任何帮助
移动 DataInserts 导入应该就足够了...
from flask import Flask
from flask_mail import Mail
from conf.mail_settings.py import mail_settings
app = Flask(__name__)
app.config.update[mail_settings]
mail = Mail(app)
from relevant_folder.data_inserts import DataInserts
@app.route("/register")
def register():
params = request.json
DataInserts.add_user(params)
或者,您可以将应用程序和邮件实例传递给 DataInsert class,而不是导入全局变量...
更新:另一种方法是使用 "flask.current_app".
from relevant_folder.data_inserts import DataInserts
from flask import Flask
from flask_mail import Mail
from conf.mail_settings.py import mail_settings
app = Flask(__name__)
app.config.update[mail_settings]
mail = Mail(app)
app.mail = mail
@app.route("/register")
def register():
params = request.json
DataInserts.add_user(params)
请注意,我将邮件实例存储在 app.mail
中以便以后访问。
relevant_folder.data_inserts.py:
from flask import current_app
from flask_mail import message
class DataInserts():
def add_user(self, new_user_json):
''' add user name and email to db logic goes here'''
msg = Message(subject="Subject",
sender=current_app.config.get("MAIL_USERNAME"),
recipients=[new_user_json["email"]],
body="Hello " + new_user_json["name"] + ", your password is password")
current_app.mail.send(msg)
但请记住 current_app
需要一个活动的应用程序上下文。
在处理请求时,上下文应该始终存在,否则您可以手动创建上下文,例如使用 with app.app_context():
有关该主题的更多信息,请参阅 flask 文档:
http://flask.pocoo.org/docs/1.0/appcontext/
我目前正在使用一个烧瓶应用程序,并试图在用户注册该网站后发送电子邮件。我在实例化应用程序的 main.py 和将数据提交到数据库并将密码通过电子邮件发回给用户的 data_inserts.py 之间进行循环导入时遇到困难。对于电子邮件功能,我使用 Flask-mail 扩展。我得到的错误如下:
ImportError: Cannot import name from 'DataInserts' from relevant_folder.data_inserts
详情如下:
main.py:
from relevant_folder.data_inserts import DataInserts
from flask import Flask
from flask_mail import Mail
from conf.mail_settings.py import mail_settings
app = Flask(__name__)
app.config.update[mail_settings]
mail = Mail(app)
@app.route("/register")
def register():
params = request.json
DataInserts.add_user(params)
relevant_folder.data_inserts.py:
from main import app
from main.app import mail
from flask_mail import message
class DataInserts():
def add_user(self, new_user_json):
''' add user name and email to db logic goes here'''
msg = Message(subject="Subject",
sender=app.config.get("MAIL_USERNAME"),
recipients=[new_user_json["email"]],
body="Hello " + new_user_json["name"] + ", your password is password")
mail.send(msg)
我觉得我的应用程序结构不正确。非常感谢任何帮助
移动 DataInserts 导入应该就足够了...
from flask import Flask
from flask_mail import Mail
from conf.mail_settings.py import mail_settings
app = Flask(__name__)
app.config.update[mail_settings]
mail = Mail(app)
from relevant_folder.data_inserts import DataInserts
@app.route("/register")
def register():
params = request.json
DataInserts.add_user(params)
或者,您可以将应用程序和邮件实例传递给 DataInsert class,而不是导入全局变量...
更新:另一种方法是使用 "flask.current_app".
from relevant_folder.data_inserts import DataInserts
from flask import Flask
from flask_mail import Mail
from conf.mail_settings.py import mail_settings
app = Flask(__name__)
app.config.update[mail_settings]
mail = Mail(app)
app.mail = mail
@app.route("/register")
def register():
params = request.json
DataInserts.add_user(params)
请注意,我将邮件实例存储在 app.mail
中以便以后访问。
relevant_folder.data_inserts.py:
from flask import current_app
from flask_mail import message
class DataInserts():
def add_user(self, new_user_json):
''' add user name and email to db logic goes here'''
msg = Message(subject="Subject",
sender=current_app.config.get("MAIL_USERNAME"),
recipients=[new_user_json["email"]],
body="Hello " + new_user_json["name"] + ", your password is password")
current_app.mail.send(msg)
但请记住 current_app
需要一个活动的应用程序上下文。
在处理请求时,上下文应该始终存在,否则您可以手动创建上下文,例如使用 with app.app_context():
有关该主题的更多信息,请参阅 flask 文档: http://flask.pocoo.org/docs/1.0/appcontext/