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

原文地址:https://www.cnblogs.com/two-peanuts/p/10728445.html