总述

2020年8月5日。是实训的第13天。
今天上午孟老师带我们学习了如何将flask工程化。其实是flask的django化。
flask作为一个轻量级的框架,把路由、数据库、项目启动全都放到了一起,虽然这样子一来开发的速度很快,但是内容一旦多起来,在一页代码中寻找会非常的麻烦。而且flask没有现成的数据库迁移工具。
所谓flask工程化,就是将app.py拆分开多个文件。
完成flask工程化后,flask稍微显得不那么轻量了(但是对比于django还是属于轻量水准的),但是工程化能使开发流程更加系统全面。
讲完flask的工程化后,时间还有剩余。孟老师向我们询问还有什么想知道的。我想起他之前说过django的session,便想让他在这时讲解一下。他很豪爽地讲解了。只用了短短10分钟。原来session这么简单啊。

flask工程化

文件配置

复制app.py的内容,然后粘贴到新建的app_config.py,略加修改,只应用在配置中使用到的包。
app = Flask(__name__)修改为:

1
2
3
4
app = Flask(__name__,
template_folder='templates',
static_folder="static",
)

同时新建两个文件夹:templatesstatic
修改完的app_config.py全文如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python
# -*- coding: utf-8 -*-
from flask import Flask
from flask_cors import CORS
import os
app = Flask(__name__,
template_folder='templates',
static_folder="static",
)
BASEDIR = os.path.abspath(os.path.dirname(__file__))

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+os.path.join(BASEDIR,'data.sqlite')
'''
如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。
'''
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

CORS(app)

数据库迁移工具

先使用pip install flask-migratepip install flask-script安装两个包。
安装完毕后,新建一个database.py文件。编写如下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#! /usr/bin/env python
# -*- coding:utf-8 -*-
from app_config import app
from models import db
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager

manager = Manager(app)

migrate = Migrate(app,db)

manager.add_command('db',MigrateCommand)

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

接下来在命令行使用python database.py db init命令,就可以初始化数据库。
使用python database.py db migrate命令,就可以生成迁移文件。
使用python database.py db upgrade命令,就可以生成数据表。

模型

新建models.py文件。将app.py中关于models的复制到这里,也略加修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /usr/bin/env python
# -*- coding:utf-8 -*-
from app_config import app
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

class Info(db.Model):
__tablename__='info2'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(255))
category = db.Column(db.String(60))

def __repr__(self):
return '<info.>%s ' % self.title

主程序

新建run.py文件。将app.py关于路由和运行的复制到这里,略加修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from flask import Flask,jsonify,render_template,request
from app_config import app
from models import Info,db


#函数和路由不可重复
@app.route('/',methods=['GET','POST']) #装饰器路由
def index(): #视图函数
info1 = Info(id=1,title='新闻1',category='娱乐新闻')
info2 = Info(id=2,title='新闻2',category='工作新闻')
db.session.add_all([info1,info2]) #将数据添加到会话
db.session.commit() #提交会话
return jsonify({'data':{'name':'Zorua','age':20}})


@app.route('/query',methods=['GET','POST']) #装饰器路由
def query():
results=Info.query.all()
for i in results:
print(i)
return jsonify({'data':'Success'})

@app.route('/update',methods=['GET','POST']) #装饰器路由
def update():
Info.query.filter(Info.title=='新闻1').update({'category':'改后新闻'})
db.session.commit() # 提交会话
return jsonify({'data':'Success'})

@app.route('/delete',methods=['GET','POST']) #装饰器路由
def delete():
Info.query.filter(Info.title=='新闻1').delete()
db.session.commit() # 提交会话
return jsonify({'data':'Success'})


@app.route('/index',methods=['POST','GET']) #装饰器路由
def hello_world(): # 视图函数
return render_template('index.html')

@app.route('/api',methods=['POST','GET']) #装饰器路由
def api(): # 视图函数
name = request.form.get('name')
age = request.form.get('age')
print(name)
return jsonify({'data':{'name':name,'age':age}})

if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0',port=8888)

接下来运行项目只用在run.py中运行即可。

django的session

session就相当于是一个字典。
request.session['user_id'] = User.objects.get(username=username).id
就可以在session中新增user_id字段并记录下来。
session中的记录是有有效期的。