1. flask路由
1.1 flask路由机制
flask使用werkzeug模块实现路由分发,其routing模块负责实现URL解析,routing模块会对请求信息的URL进行解析,匹配到URL对应的视图函数,以此生成一个响应信息。
routing模块内部有Rule类(用来构造不同的URL模式的对象)、Map类(存储所有的URL规则)、MapAdapter类(负责具体URL匹配的工作)
- flask路由绑定实现:app.route(rule, **args) ---> 装饰器(调用add_url_rule方法将请求url和视图函数绑定添加到路由映射列表中)
- 查看所有路由信息:app.url_map
- 路由中限制访问视图函数的请求方法:参数methods=[请求方法列表]
- 同一个路由对应多个视图函数:一般使用不同的请求方法进行区分
- 多个路由对应一个视图函数:即多个url可访问同一个视图函数(app.route()返回的装饰器叠加装饰)
- url反向解析:url_for()函数 ---> 接收视图函数的名字进行解析,返回一个url请求路径
- 可选参数:_external=True 可以返回请求的url绝对地址
- 用处一:常用在重定向时使用:先根据视图函数名字获取请求url,再使用redirect(url)函数重定向到指定页面
- 用处二:模板文件中反向解析生成跳转链接(因为url_for为特殊方法,flask自动传递到模板文件中可使用)
1.1 路由参数提取
路由参数提取:多数情况下我们需要从url请求路径中捕获有关参数,传入视图函数进行相关操作。使用格式:<转换器:变量名>
注意:不加转换器类型直接使用变量名则使用默认的string转换器
自定义转换器:
- 自定义转换器: flask封装werkzeug模块,自定义转换器继承与werkzeug.routing模块中的BaseConverter(定义好后需要添加到flask程序实例的转换器字典中)
- 初始化方法__init__(self, url_map, regex):接收第一个参数url_map代表flask程序示例的url映射列表;第二个参数regex为匹配参数使用的正则表达式
- to_python(self, value)方法: 正则表达式匹配到的数据经过te_python方法处理后作为匹配后的返回值
_ to_url()方法:在url_for反向解析时调用此方法
from flask import Flask, url_for, redirect
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 自定义转换器类
class RegexConverter(BaseConverter):
"""万能转换器:根据传入的正则表达式"""
def __init__(self, url_map, regex):
super().__init__(url_map)
self.regex = regex # 使用传入的正则表达式来匹配路由中的参数
def to_python(self, value):
return value
def to_url(self, value):
return value
# 将自定义的转换器类添加到app对象的路由映射列表转换器内
app.url_map.converters["my_converter"] = RegexConverter
# 转换器提取路由参数
@app.route("/get_goods/<int:goods_id>")
def goods_info(goods_id):
"""url捕获goods_id,查询数据后返回"""
return "这是%s号商品的详细信息!!" % goods_id
# 自定义转换器调用
@app.route("/converter/<my_converter(r'1[34578]\d{9}'):phone>")
def test_converter(phone):
return "匹配到了手机号:%s" % phone
if __name__ == "__main__":
app.run(debug=True)
2. flask请求
用户通过浏览器发起请求,请求到达服务器,服务器使用WSGI协议转发请求到应用程序框架进行处理,用户请求到达flask项目时被封装为request对象。
request对象具有上下文的概念,因为无论进入哪个视图函数,使用request对象相关属性获取的请求信息都是当次的请求。
2.1 request对象
视图函数通常需要获取用户请求提交的相关数据,可以通过request对象的相关属性获取(get方法):
- form:记录请求中的表单格式数据,类似于字典,可一键多值(key=value&key=value格式)
- data:记录请求中的非表单格式数据(json, HTML, XML, Text等),二进制字符串(需要解码)
- args:记录请求中的查询参数,类似于字典,可一键多值(url请求路径中的?key1=value1&key2=value2格式数据)
- cookies:记录请求中的cookie信息,字典类型
- headers:记录请求中的报文头部
- methods:记录请求使用的HTTP方法,字符串类型
- url:记录请求的url地址,字符串类型
- files:记录请求上传的文件,类似于Python标准的文件对象
注意:当前端发送的数据全部是表单格式数据会直接存放在request.form里面,不会存放在request.data里面
当前端发送的表单格式数据为一键多值情况,使用get方法只能获取第一个值,可使用getlist方法获取(返回列表)
使用postman模拟请求:
- 表单格式:使用form-data(多媒体表单)、x-www-form-urlencoded(普通表单)
- 非表单格式:使用raw格式,可选择json, HTML, XML, Text等
- 查询字符串:选择Params选项
2.2 文件上传
re