参考内容:
在fastapi教程-进阶(三)和fastapi教程-进阶(二)中我们介绍了Query、Path和Body参数,这里介绍cookie和header
Cookie
1 | from typing import Optional |
要获取cookie,必须需要使用
Cookie来声明,否则参数将被解释为查询参数。
Header
1 | from typing import Optional |
启动服务,并尝试请求http://127.0.0.1:8000/items/,会返回:
1 | {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"} |
我们会发现,代码中的user_agent会自动获取请求头中的User-Agent的值,但是他们的大小写和符号并不相同,这是为什么呢?
大部分请求头中的key是用
-来分割的,比如User-Agent,但是这种命名在python中是不符合规范的,因此,Header会自动将参数名称中的下划线_转换为连字符-。另外,http请求头不区分大小写,因此我们可以用符合python规范的命名方法来表示他们。
如果由于某种原因需要禁用下划线_到连字符-的自动转换,需要将Header的参数convert_underscores设置为False:
1 | from typing import Optional |
这时我们在请求http://127.0.0.1:8000/items/时,会返回:
1 | {"User-Agent":null} |
重复的请求头
如果请求头中同一个key有多个value,例如:
1 | X-Token: foo |
这时候应该如何定义呢?
1 | from typing import List, Optional |
我们用postman模拟请求![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZcD2UYHg-1598929224418)(evernotecid://FBE381A3-17C7-41D9-AA37-9C5F29FAB396/appyinxiangcom/20545635/ENResource/p215)]](https://img-blog.csdnimg.cn/20200901110138328.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE1NjQ4Nw==,size_16,color_FFFFFF,t_70#pic_center)
会返回:
1 | { |
总结
- 如果要获取cookie或header,必须要用
Cookie或Header来声明参数,否则fastapi会把参数当作查询参数 -
Header会自动转换请求头中的参数,将参数名称中的下划线_转换为连字符-,因此在参数命名时我们可以遵守python规范 - 如果不想让
Header自动转换可以给Header设置convert_underscores=False - 获取重复请求头时只需要用
List来声明参数类型
上述栗子均放到git上啦,地址:戳这里