在 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/