【教程】Python Flask快速学习
备注
2021/3/28 星期日
简单学习了一下python web开发,选择了使用最简单的flask框架,这里记录一下
一、概念
flask框架是一个很简单的python web框架,类似的框架还有django和fastapi,flask的优势是简单易上手,方便进行一些不太复杂场景的开发。
二、核心结构
flask只需要最简单的几行代码就可以运行一个web程序,这也是flask的核心结构,后续更加复杂的开发都是建立在这个结构基础上的
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'hello world'
if __name__ == '__main__':
app.run()
1.启动参数
可以在app.run()中指定主机名、端口号和debug模式
app.run(host="localhost", port=5000, debug=Ture)
2.路由
注解:
路由是url和所需要执行代码的映射关系,可以使用@注解符进行声明,同时可以methods指定允许的方法,如果不指定默认只支持GET方法
@app.route("/path", methods=["GET", "POST"])
如果路由路径需要使用变量可以使用<>包裹变量名进行变量提取
@app.route("/path/<id>")
传入的变量默认为string类型,可以使用转换器将变量转换为其他类型,同时要记得在处理函数中声明对应名称的变量
@app.route("/path/<类型:id>")
def index(id):
return 'index'
类型 | 说明 |
---|---|
string | 不允许包含/的字符串 |
int | 整数 |
float | 正浮点数 |
path | 允许包含/的字符串 |
uuid | 通用唯一识别码是一个固定格式 |
any | 仅允许枚举中的值,例如:/path/<any(type1,type2):id> |
蓝图:
再更加复杂的项目中也可以使用蓝图作为中间变量传递路由,以防止出现循环引用
from flask import BluePrint
bp = BluePrint('蓝图名', __name__)
@bp.route("/")
def index():
return 'index'
app.register_buleprint(buleprint = bp)
三、请求处理
1.获取请求类型
2.获取请求路径
3.获取请求协议
4.获取请求头
5.获取请求数据
get请求:
get请求中的参数为args,再使用get()方法获取所需键的值即可
data = request.args.get('key')
post请求:
post请求的数据有键值对和json两类常见格式,分别使用不同方式获取
# 对于键值对形式的数据
data = request.form.get('key')
# 数据为json格式,获取json格式数据有两种方式
data = request.json.get('key')
## 6.示例
```python
@app.route('/', methods=['GET', 'POST'])
def home():
if request.method == 'GET':
# 相同效果二选一
data = request.args.get('key')
data = request.values.get('key')
if request.method == 'POST':
if request.content_type == 'application/json':
# 相同效果二选一
data = request.json.get('key')
data = request.get_json()['key']
elif request.content_type == 'application/x-www-form-urlencoded':
data= request.values.get('key')
elif request.content_type == 'multipart/form-data':
# 相同效果二选一
data = request.form.get('key')
data = request.form['key']
else:
data = request.get_data()
return data
四、响应设置
1.设置状态码
2.设置响应头
3.设置响应体
提供了jsonify方法将字符串转化为json格式
提供了render_template方法将渲染html页面
提供了redirect方法将访问重定向到目标网站
4.模板语法
前后端不分离的情况,使用jinja2语法
变量 {{}} 直接将变量传递给html
过滤器 | 类似Linux管道符直接执行函数
自定义过滤器 定义函数再使用add_template_filter进行添加
app.add_template_filter(函数名, "过滤器名")
五、数据库连接池
数据库创建
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='name', passwd='password', charset='utf-8', db='database')
cursor = conn.cursor()
cursor.execute("select * from table")
res = cursor.fetchone()
cursor.close()
conn.close()
dbutils
import dbutils
dbpool = PooledDB(creator=pymysql, maxconnections=10, maxcached=5, mincached=2, blocking=True, setsession=[], ping=0)
参数列表
参数 | 作用 |
---|---|
creator | 使用的连接模块 |
maxconnections | 允许连接的最大数量,0表示不限制 |
maxcached | 连接池中最多空闲连接数量,0表示不限制 |
mincached | 初始化时最少创建空闲连接数量,0表示不创建 |
blocking | 没有空闲连接时是否等待,True等待,False不等待直接报错 |
setsession | 开始会话前执行的命令列表 |
ping | 定期ping数据库是否可用,0表示不进行 |
其余创建连接中用到的参数 | 如:host、port、user、passwd、charset、db等 |
六、结构拆分
对于大项目需要对项目的结构进行拆分,常见的结构如下:
└─项目名
└─模块名
└─static
└─template
└─__init__.py
└─models.py
└─views.py
...
└─模块名
└─static
└─template
└─__init__.py
└─models.py
└─views.py
└─app.py
文件 | |
---|---|
static | 保存css、js等静态资源 |
template | 保存html文件 |
init.py | 初始化 |
models.py | 用于连接数据库 |
views.py | 用于路由和视图函数 |