上一篇中已经讲述了:HTTP协议向服务器传参有几种途径{ 链接 }
在Flask中同样通过这4中传参途径进行归纳:
1. URL中路径参数的获取:
拓展:
- # 路由参数/路径参数:http://127.0.0.1:5000/users/13312345678
- # 路由查询参数:http://127.0.0.1:5000/users/?mobile=13312345678&?user_name="yd"
1.1 是什么?
Flask不同于Django直接在定义路由时编写正则表达式的方式,而是采用转换器;
1.2 怎么用?
-
-
2.作用:提取URL路径参数
-
3.效果:将该位置数据以
字符串格式
匹配,值同样为字符串
类型,转换器中的值为参数名传入视图
# 127.0.0.1/user/123
@app.route('/users/<user_id>') def user_info(user_id): print(type(user_id)) return 'hello user {}'.format(user_id)
DEFAULT_CONVERTERS = { "default": UnicodeConverter, "string": UnicodeConverter, "any": AnyConverter, "path": PathConverter, "int": IntegerConverter, "float": FloatConverter, "uuid": UUIDConverter, }
http://127.0.0.1:5000/users/4/2/3 # @app.route('/users/<path:user_id>') # user_id=4/2/3 @app.route('/users/<string:user_id>') # 找不到 http://127.0.0.1:5000/users/4 # 只能匹配到/users/ 斜线后面部分 # user_id=4 # string匹配的转换器所在位置的数据,不带斜线 # path配置转换器所在位置的数据,包括(除# ?之外的所有符号【包括中引文不同状态】)
- 8.自定义转换器
-
内置转换器不满足需求时,自定义匹配
-
8.2怎么做?
参考源码实现
#app文件导包routing中的map类,app.py中类属性 = routing中的 map类, map类属性:self.converters = self.default_converters.copy() 。。。
-
8.3实现步骤:
-
定义类
-
继承BaseConverter
-
定义正则表达式
-
把自定义转换器,添加到默认转换字典中
-
8.4案例:
# 个人练习:匹配学号--2015100446 class StuIdConverter(BaseConverter): regex = "20[0-5]{2}100\d[0-9]{2}" # 添加自定义转换器到默认转换器字典中 app.url_map.converters['stu_id'] = StuIdConverter @app.route('/<stu_id:data>') def get_stu_id(data): print("stu_id={}".format(data)) return 'stu_id value is stu_id={}'.format(data)
2.查询参数,请求头,请求体
使用请求上下文对象request获取
属性 | 说明 | 类型 |
---|---|---|
data | 记录请求的数据,并转换为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录请求中的查询参数 | MultiDict |
cookies | 记录请求中的cookie信息 | Dict |
headers | 记录请求中的报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST |
url | 记录请求的URL地址 | string |
files | 记录请求上传的文件 | * |
案例:
# 访问127.0.0.1:5000/?name=yd,获取name值 from flask import request app = Flask(__name__) @app.route("/") def index(): name = request.args.get("name") return "请求参数:{}".format(name) if __name__ == "__main__": app.run()
#上传图片
from flask import Flast, request
app = Flask(__name__)
@app.route("/img", methods=["POST"])
def up_load():
image = request.file.get("image")
image.save("./new_image.jpg")
if __name__ == "__main__":
app.run()
# 注释
1. 客户端发图片是post请求,而Flask默认是GET请求,所以我们需要指明请求方式是POST
2. 通过request.file.get("image")获取到前端上传的文件,我们直接用image接受,image此时是一个对象,我们可以直接用image.save()方法保存。保存时需要指定存储路径和文件名。
3. 注意坑:
-
-
method:get请求方式也能提交
form表单