十三、分开Models和解决循环引用
2018-09-12 本文已影响90人
十柒年
1、为什么要分开models
在第8篇文章给大家讲了一下Flask_SQLAlchemy的基本用法,那时候写Class还是直接写在主app.py这个文件中,如果以后需要的表特别多,要是还写在app.py中,就显得代码可读性太低了,所以为了理清代码文件的关系,我们需要重新建立一个models.py ,专门用来存放咱们的models。代码如下。
from app 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)
这里咱们只是新建一个模型测试下。然后app.py代码如下。
from flask import Flask
from models import Article
from flask_sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
app.config.from_object(config)
db.SQLAlchemy(app)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
写到这里不知道大家有没有发现一个问题,在app文件中,咱们引入了from models import Article
,在models.py中咱们引入了from app import db
,两个文件相互引用了,这个就是循环引用。出现循坏引用,代码就无法正常执行了。
![](https://img.haomeiwen.com/i6375263/7b0144004abf7a27.png)
2、那么如何解决循环引用呢
想要解决循环引用,那么只需要保证两个文件不相互都需要对方就行了,这时候咱们可以加入第三个文件,让两个文件都需要第三个文件,类似下面这种图。
![](https://img.haomeiwen.com/i6375263/cb395fb17a6a3647.png)
这时候咱们新建第三个文件,exts.py,写入如下代码。
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
咱们在这里来定义db,让models.py文件引入estx.py中的DB。models.py 修改如下。
from exts 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)
app.py,页面就不需要再引入flask_SQLAlchemy了,这时候有人可能会问了,db = SQLAlchemy()
不是需要加参数app吗?没错,但是不在exts.py 中加,在exts.py中在引入app,那不就又是循环了吗?所以app.py修改如下。
from flask import Flask
from models import Article
from exts import db
import config
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
这里主要看db.init_app(app)
,在这里再给SQLAlchemy添加app参数。这样就保证不会出现循坏引用了。
Study hard and make progress every day.
更多学习资料请关注"爱游戏爱编程"。
爱游戏爱编程.jpg