如何将Flask的db.Model模型类存放至独立.py文件并在主文件中调用
实现方案
方案1:标准拆分(推荐,无循环导入风险,适合长期维护项目)
该方案将全局扩展单独抽离管理,从根源避免循环导入问题,后续新增其他模型/扩展也可以沿用相同结构:
- 新建和
main.py同目录的extensions.py文件,存放全局扩展实例:
# extensions.py from flask_sqlalchemy import SQLAlchemy # 先实例化数据库对象,暂时不绑定Flask应用 db = SQLAlchemy()
- 新建和
main.py同目录的models.py文件,定义Contact模型:
# models.py from extensions import db class Contact(db.Model): sno = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), unique=False, nullable=False) email = db.Column(db.String(50), unique=True, nullable=False) phone = db.Column(db.String(50), unique=True, nullable=False) msg = db.Column(db.String(50), unique=False, nullable=False) myDate = db.Column(db.String(50), unique=False, nullable=False)
- 修改
main.py代码,调整导入逻辑并绑定应用:
# main.py 调整后完整代码 from datetime import datetime from enum import unique from flask import Flask, render_template, request from flask.wrappers import Request # 导入抽离的数据库实例和模型 from extensions import db from models import Contact app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost/thecleandb' # 给数据库实例绑定当前Flask应用 db.init_app(app) @app.route("/contact", methods=['GET','POST']) def contact(): if (request.method=='POST'): name= request.form.get('name') email = request.form.get('myemail') phone_number = request.form.get('myphone') message = request.form.get('msg') database_entry = Contact(name=name, email=email, phone=phone_number, msg=message, myDate=datetime.now().date() ) db.session.add(database_entry) db.session.commit() return render_template('contact.html') else : return render_template('contact.html') if __name__ =='__main__': app.run(debug=True)
方案2:极简拆分(适合小型临时项目)
如果不想新增额外的扩展管理文件,可以通过调整导入顺序规避循环导入问题:
- 新建和
main.py同目录的models.py文件:
# models.py from main import db class Contact(db.Model): sno = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), unique=False, nullable=False) email = db.Column(db.String(50), unique=True, nullable=False) phone = db.Column(db.String(50), unique=True, nullable=False) msg = db.Column(db.String(50), unique=False, nullable=False) myDate = db.Column(db.String(50), unique=False, nullable=False)
- 修改
main.py,必须保证模型导入逻辑放在数据库实例初始化之后:
# main.py 调整后完整代码 from datetime import datetime from enum import unique from flask import Flask, render_template, request from flask.wrappers import Request from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost/thecleandb' db = SQLAlchemy(app) # 必须放在db实例化之后导入,否则会触发循环导入报错 from models import Contact @app.route("/contact", methods=['GET','POST']) def contact(): if (request.method=='POST'): name= request.form.get('name') email = request.form.get('myemail') phone_number = request.form.get('myphone') message = request.form.get('msg') database_entry = Contact(name=name, email=email, phone=phone_number, msg=message, myDate=datetime.now().date() ) db.session.add(database_entry) db.session.commit() return render_template('contact.html') else : return render_template('contact.html') if __name__ =='__main__': app.run(debug=True)
注意:该方案依赖严格的导入顺序,项目规模扩大后容易出现导包错误,仅适合临时小型项目使用。
内容的提问来源于stack exchange,提问作者user5058807
相关产品推荐
相关产品推荐

