flask基础
什么是flask
Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。
Flask主要包括Werkzeug和Jinja2两个核心函数库,它们分别负责业务处理和安全方面的功能,这些基础函数为web项目开发过程提供了丰富的基础组件。
-
Werkzeug库十分强大,功能比较完善,支持URL路由请求集成,一次可以响应多个用户的访问请求;
-
支持Cookie和会话管理,通过身份缓存数据建立长久连接关系,并提高用户访问速度;
-
支持交互式Javascript调试,提高用户体验;
-
可以处理HTTP基本事务,快速响应客户端推送过来的访问请求。
-
Jinja2库支持自动HTML转移功能,能够很好控制外部黑客的脚本攻击。系统运行速度很快,页面加载过程会将源码进行编译形成python字节码,从而实现模板的高效运行;
-
模板继承机制可以对模板内容进行修改和维护,为不同需求的用户提供相应的模板。
基本模式
Flask的基本模式为在程序里将一个视图函数分配给一个URL,每当用户访问这个URL时,系统就会执行给该URL分配好的视图函数,获取函数的返回值并将其显示到浏览器上,其工作过程见图。
入门例子
from flask import Flask, jsonify |
路由
路由传递参数 任意路由
|
自带的路由参数转换器限定参数类型
#: the default converter mapping for the map. |
举例
|
自定义路由参数转换器(正则匹配)
from werkzeug.routing import BaseConverter |
通用路由参数转换器
可以临时注册路由参数转换器时限定其regex,从而实现ReGex的复用
from werkzeug.routing import BaseConverter |
Request
从客服端发送的请求都会集中到request来处理,其中request有以下集中方法:
request.method # 获取本次http请求的方式 有 get post put patch delete |
response
响应默认两种响应
- 页面响应 html
- 数据响应 json - jsonify(data)
响应报文部分,可以通过以下三种方法获取:
- r.json():如果报文结构为 json 格式,则解析为字典格式,也就是说此方法获取的结果是字典。注意,如果报文主体不是 json 格式,则会抛出异常。
- r.text:text 属性,可以以此方式返回除二进制外的任意数据格式,比如 HTML,XML,Json 均可。网络爬虫中一般使用此方式获取 HTML 页面。
- r.content:content 属性用于获取二进制的数据格式,比如视频、图片等,常用于网络爬虫中爬取图片、视频等资源。
- 图片传输1 :
无论从从服务器接收图片,还是发送给客户端,都是将图片转化成base64字节流形式返回,收到这串字节数据,然后通过base64将字节转化为图片。
发送方: res = base64.b64encode(f.read())
接收方: img = base64.b64decode(result)
-
图片传输2:
with open("2.jpg","rb") as f:
content = f.read()
response = make_response(content)
response.headers["Content-Type"]="image/jpeg"
return response- zip下载
with open("2.zip","rb") as f:
content = f.read()
response = make_response(content)
response.headers["Content-Type"]="application/zip"
return response
重定向
自定义响应
cookie
session
请求钩子
- 网站第一次启动时 第一个请求 before_first_request 常见操作是:数据库连接,网站全局缓存
- before_request 判断权限、识别用户身份
- after_request 日志记录、操作历史记录、备份操作
- teardown_request 每次请求中报错才执行,异常处理、错误日志记录
abort抛出http异常
raise抛出异常
上下文
请求上下文
应用上下文
- 注意g变量是个临时的变量,不能存储变量长时间,长时间你的话最好用 数据库或者redis
请求上下文 与应用上下文区别:
- 请求上下文保存了客户端和服务端的交互数据,一般来自于客户端
- 应用上下文:flask应用程序运行过程中,保存的一些配置信息,比如路由列表,程序名,数据库连接,应用信息。
数据库操作
sqlalchemy数据类型
sqlalchemy的列约束选项
数据库操作
举例
from flask import Flask, render_template |
查询
query 相当于 select… where … 部分,query 中给定条件相当于指定 where 的筛选条件。
删除
更新
分页器使用
分组查询、聚合函数
原生 sql
关联查询
举例
一对一的关系
创建类关联模型 注意 db
|
一对多关系
一个老师上多门课程
举例
|
但是该种方法及其的不便,对于 takes 表中的另外的字段 score time,不能在代码中进行设置,只能设置 student 与 course 表的外键字段。
而且该种方法通过 student 添加 course,与通过 teacher 添加 course 可能产生冲突,(course 的 name unique 不能重复,所以当通过 student 添加 java 一门课程时候,再通过 teacher 添加 java 这门课程就会违反 unique 约束)
另外的实现方式
创建 student 与 course 之间的关联关系模型
|