05解决flask循环引用的问题
1, 什么是循环引用问题?为什么会导致循环引用?
1.1先讲是什么?
主文件中class类过多会导致主文件冗余,如下图,所以我们单独给class类一个文件,然后再引用它。
1.2再讲为什么?
主文件为models_sep.py文件,
models.py文件为:
可以看到,models.py文件要从主文件models_sep.py中引用生成的db,即“db = SQLAlchemy(app)”,在models.py中写完“class Article(db.Model):”后要被主文件models_sep.py引用回去,这时候回出现如下情况:
这里为什么不能导入“Article”呢?因为:
这就导致了循环引用。
2,解决方案为,把db单独放个文件装起来:
3,最后的效果为:
#models_sep.py
''' 这里相当于把“class Article”模型之类的放在不同的py文件中。 ''' from flask import Flask from models import Article #在hello_world会用到Article,所以需要引用,引用就会出错,所以需要这样写。
from ext import db import config app = Flask(__name__) app.config.from_object(config) db.init_app(app) #这里“init_app”是专门为了解决循环引用的
db.create_all()
@app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
#ext.py
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()
#models.py
from ext import db class Article(db.Model): __tablename__ = "article" id = db.Column(db.Integer,primary_key=True,autoincrement=True) title = db.Column(db.String(100),nullable=False)
# config.py #dialect+driver://username:password@host:port/database # dialect:是数据库的实现,比如MySql,SQLlite,且转换为小写 # driver:对应的驱动,比如MySql的驱动是MySqldb # username:连接数据库的用户名 # password:密码 # host:连接数据库的域名 # port:数据库监听的端口号 # database:是连接的数据库的名字,创建数据库语句为: """create database db_demo1(database_name) charset utf8""" # 如果以上输出了1则说明SQLAlchemy能成功连接到数据库。 DIALECT = "mysql" DRIVER = "mysqldb" USERNAME = "root" PASSWORD = '1234' HOST = "127.0.0.1" PORT = "3306" DATABASE = "xh" SQLALCHEMY_DATABASE_URI="{}+{}://{}:{}@{}:{}/{}".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE) """指定一个名为SQLALCHEMY_DATABASE_URI的固定变量,注意是固定的写法""" SQLALCHEMY_TRACK_MODIFICATIONS =False