响应
什么是响应
响应就是由服务器端带给客户端的内容,响应内容可以是字符串,模板,重定向
响应字符串
- 响应字符串
return '普通字符串'
- 响应模板
return render_template('xxx.html')
本质 还是响应字符串 - 响应对象
响应对象: 将响应内容封装到一个对象中,以便完成更多的响应行为
在Flask中,使用 make_response() 构建响应对象
from flask import make_response
@app.route('/xxx')
def xxx():
# 返回对象
resp = make_response('响应内容')
# 返回字符串
resp = make_response(render_template('.html'))
# 允许调用resp中的属性或方法以便完成更多的响应行为
return resp
- 重定向
什么是重定向
由服务器通知客户端重新向新的地址发送请求,状态码:302
语法:
from flask import redirect
@app.route('/xx')
def xxx():
xxxx
return redirect('重定向地址')
文件上传
注意问题
表单中如果有文件上传的话,必须遵循以下两个要求:
- 表单的提交方式
method
必须为post
- 表单的
enctype
属性值必须为multipart/form-data
<form method='post' enctype='multipart/form-data'></form>
服务器端
获取上传文件
语法: request.files
作用: 获取上传的所有的文件
f = request.files['uimg']
从上传的文件中,将名称为 uimg 的文件获取出来并保存在 f 中
将文件保存到指定的目录处
语法: f.save('保存路径')
作用:将文件保存到指定目录处
注意:
- 保存路径可以是相对路径也可以是绝对路径
- 保存路径要精确到文件名称
- 保存的目录必须是已存在的
ext:
f.save('static/'+f.filename)
f.filename: 能够获取出文件名
思考:
上传的文件,文件名称由 年月日时分秒. 扩展名 组成
@app.route('/upload', methods=['POST', 'GET'])
def file_upload():
if request.method == 'GET':
return render_template('file_upload.html')
else:
f = request.files.get('uimg')
basedir = os.path.dirname(__file__)
print(basedir)
ftime = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')
ext = f.filename.split('.')[1]
filename = ftime + '.' + ext
upload_path = os.path.join(basedir, 'static/upload', filename)
f.save(upload_path)
return 'Save Ok'
模型-Models
1.什么是模型 实体类 | 模型类 |
模型是根据数据库中表结构而创建出来的class,也就是将数据表进行‘类化’,以类(对象)的方式来操作数据表(数据库)。
数据库中的每一张表到编程语言中,就是一个class;
表中的每一个列对应到编程语言中就是class中的一个属性;
表中的每一条数据对应到编程语言中就是class的一个对象
实体完整性:保证数据不重复,利用主键实现
模型的框架
ORM: Object Relational Mapping 对象关系映射
ORM的优点
- 封装了数据库中所有的操作,大大的提高了开发效率
- 可以省略庞大的数据访问层,即便不用SQL编码也能完成对数据的CRUD的操作
ORM框架的三大特征
1. 数据表(Table)到编程类的 (Class)的映射
数据库中每一张表对应到编程语言中都有一个类
在ORM中:
允许将 数据表 自动 生成一个类
允许将 类 自动 生成一张数据表
2.数据类型的映射
数据表中的字段以及数据类型 对应到 编程语言中有对应的属性和类型
3.关系映射
将数据库中表与表之间的关系 对应到编程语言中类与类之间的关系
数据库中表与表之间的关系:
一对一:
A表中的一条记录能够与B表中的一条记录相关联
B表中的一条记录能够与A表中的一条记录相关联
一对多:
A表中的一条记录能够与B表中的多条记录相关联
B表中的一条记录能够与A表中的一条记录相关联
多对多:
A表中的一条记录能够与B表中的多条记录相关联
B表中的一条记录能够与A表中的多条记录相关联
实现方式:
增加第三张关联表来实现多对多
内连接查询
select s.sname, c.cname from student as s
inner join student_course as sc
on s.id = sc.sid
inner join course as c
on sc.cid = c.id
where c.cname = '钢管舞'
数据库可视化工具:
- Navicate for MySQL
- Power Designer: 强悍的数据库建模工具-ER(Entity Realtionship)能够生成数据库语句
Flask中的ORM框架
1.python 中的ORM
比较常用的ORM框架- SQLAlchemy
安装:sudo pip3 install SQLAlchemy
2.在Flask中
使用的也是 SQLAlchemy,但是需要安装 Flask-SQLAlchemt
安装:sudo pip3 install flask-sqlalchemy
在Flask中配置数据库
- 通过app(Flask应用实例)构建配置信息
app.config['SQLALCHEMY_DATABASE_URI']="mysql://用户名:密码@主机:端口/数据库"
app.config['SQLALCHEMY_DATABASE_URI']="mysql://root:123456@localhost:3306/flask"
创建数据库应用实例
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
定义模型
语法:
class MODELNAME(db.Model):
# 表名
__tablename__ == 'TABLENAME'
# 字段名
COLUMN_NAME = db.Column(db.TYPE,OPTIONS)
MODELNAME: 定义的模型类的类名,通常参考表名
TABLENAME: 映射到数据库中表的名称
COLUMN_NAME: 属性名,映射到数据表中就是列名
TYPE: 映射到列的数据类型
OPTIONS: 列选项
db.TYPE 列的数据类型
类型名 | python类型 | 说明 |
---|---|---|
Integer | int | 普通整数,32位 |
SmallInteger | int | 小范围整数,16位 |
BigInteger | long | 不限精度的整数 |
Float | float | 浮点类型 |
Numeric | decimal.Decimal | 定点类型 |
String | str | 变长字符串 |
Text | str | 变长字符串 |
Boolean | bool | 0 | 1 |
Date | datetime.date | 日期 |
Time | datetime.time | 时间 |
DateTime | datetime.datetime | 日期和时间 |
OPTIONS 列选项
选项名 | 说明 |
---|---|
primary_key | 如果设置为True表示该列为主键 |
unique | 如果设置为True表示该列的值唯一 |
index | 如果设置为True表示该列要创建索引 |
nullable | 如果设置为True表示该列允许为空,默认允许为空 |
default | 指定该列的默认值 |