Flask web开发之路九

Posted 嶙羽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask web开发之路九相关的知识,希望对你有一定的参考价值。

首先介绍循环引用的问题:

当一个模块需要引用另一个模块的类,而另一个模块又需要引用这个模块的类时,就出现了循环引用,而没法导入类,这时候可以切断其中一条引用路径,增加一个模块

项目结构:

models_sep.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)

#db.create_all()

@app.route(\'/\')
def hello_world():
    return \'Hello World!\'


if __name__ == \'__main__\':
    app.run(debug=True)

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)

exts.py代码:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

### 分开`models`以及解决循环引用:
1. 分开models的目的:为了让代码更加方便的管理。
2. 如何解决循环引用:把`db`放在一个单独的文件中,切断循环引用的线条就可以了。

然后,讲一下模型初始化init,模型迁移migrate和模型upgrade

要解决的问题:假如第一次创建好数据模型后,之后要更改模型结构,增删改查等等,粗暴的方式是删掉整张表,然后再新建,但是这样非常不利于维护,因此有需要用到Flask_Migrate

项目结构:

migrate_demo.py代码:

from flask import Flask
from exts import db
import config
from models import Article

app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)


# 新建一个article模型,采用models分开的方式
# flask-scripts

@app.route(\'/\')
def hello_world():
    return \'Hello World!\'


if __name__ == \'__main__\':
    app.run(debug=True)

manage.py文件代码:

from flask_script import Manager
from migrate_demo import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article

# init
# migrate
# upgrade
#模型 -> 迁移文件 -> 表

manager = Manager(app)

#1.要使用flask_migrate,必须要绑定app和db
migrate = Migrate(app,db)

#2.把MigrateCommand命令添加到manager中
manager.add_command(\'db\',MigrateCommand)

if __name__ == \'__main__\':
    manager.run()

exts.py文件代码;

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

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)
    content = db.Column(db.Text,nullable=False)
    tags = db.Column(db.String(100),nullable=False)
    #authors = db.Column(db.String(20),nullable=False)

在终端的项目文件路径中依次运行:

python manage.py db init 

python manage.py db migrate

python manage.py db upgrade

发现在数据库中已经创建好了article表

然后在models.py文件里给数据模型新增一个数据字段authors,接着在终端里运行python manage.py db migrate和python manage.py db upgrade

可以用发现数据库表里面已经对article做了修改:

### Flask-Migrate的介绍与安装:
1. 介绍:因为采用`db.create_all`在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,然后重新运行`db.craete_all`才会重新映射,这样不符合我们的需求。因此flask-migrate就是为了解决这个问题,她可以在每次修改模型后,可以将修改的东西映射到数据库中。
2. 首先进入到你的虚拟环境中,然后使用`pip install flask-migrate`进行安装就可以了。
3. 使用`flask_migrate`必须借助`flask_scripts`,这个包的`MigrateCommand`中包含了所有和数据库相关的命令。
4. `flask_migrate`相关的命令:
* `python manage.py db init`:初始化一个迁移脚本的环境,只需要执行一次。
* `python manage.py db migrate`:将模型生成迁移文件,只要模型更改了,就需要执行一遍这个命令。
* `python manage.py db upgrade`:将迁移文件真正的映射到数据库中。每次运行了`migrate`命令后,就记得要运行这个命令。
5. 注意点:需要将你想要映射到数据库中的模型,都要导入到`manage.py`文件中,如果没有导入进去,就不会映射到数据库中。
6. `manage.py`的相关代码:
```
from flask_script import Manager
from migrate_demo import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article

# init
# migrate
# upgrade
# 模型 -> 迁移文件 -> 表

manager = Manager(app)

# 1. 要使用flask_migrate,必须绑定app和db
migrate = Migrate(app,db)

# 2. 把MigrateCommand命令添加到manager中
manager.add_command(\'db\',MigrateCommand)

if __name__ == \'__main__\':
manager.run()
```

 

以上是关于Flask web开发之路九的主要内容,如果未能解决你的问题,请参考以下文章

Flask web开发之路三

Flask web开发之路十四

Flask web开发之路九

Flask web开发之路六

Python Web开发之路

Python学习之路--Flask+MongoDB搭建Restful Server