Flask交流

十三、分开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,两个文件相互引用了,这个就是循环引用。出现循坏引用,代码就无法正常执行了。

image.png

2、那么如何解决循环引用呢

想要解决循环引用,那么只需要保证两个文件不相互都需要对方就行了,这时候咱们可以加入第三个文件,让两个文件都需要第三个文件,类似下面这种图。


image.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
上一篇 下一篇

猜你喜欢

热点阅读