一、FastAPI框架中如何提取request请求的内容信息
FastAPI中做了大量包装,因此我们可以直接写一个方法拿到get,post数据处理后返回给调用方,但有时我们仍然需要直接使用request来处理,FastAPI也提供了方法直接拿到request来处理。示例如下:
#需要先引入Request模块
from fastapi import FastAPI, Request
app = FastAPI()
#定义路由,并且在方法中带上request: Request
@app.get("/items/{item_id}")
def read_root(item_id: str, request: Request):
client_host = request.client.host
return {"client_host": client_host, "item_id": item_id}
如上只需要定义路由,在方法中带上request: Request,就可以直接使用request来取得我们要拿的请求信息。看起来好像是可以,但真正到业务开发,发现这样依然不能满足有时的需求,比如我们要对很多请求进行操作记录,包括记录用户的操作IP地址,我们在很多方法最后加上一句调用,如果都靠这里从request取得IP地址传给调用方法就显得太累赘了,能不能在非路由方法(上面不带app.get、post之类)中加上request呢?答案是不能,我尝试了多次,发现这样是行不通的,后来我定义了一个公共类及属性,在框架的执行层将这个request传递给公共类属性,之后的操作日志统一调用公共类的方法,而公共类中直接拿已经初始化的request即可。
除此之外,我们还想知道这个request到底有多少东西可以给我们调用,在查看Fastapi框架之后,我打印了里面不少的属性数据,找到一个属性scope,它包含了request中的很多数据,我们可以将上面的return语句改成如下语名,访问后就能看到所有的数据明细。
return {"scope": str(request.scope), "item_id": item_id}
二、FastAPI框架中的 request 内容大全
request.scope中包含的数据如下:
- type: 请求是http还是https
- scheme:和type基本一样吧
- method: GET、post等
- http_version: 1.1,
- path: 请求的路径,
- raw_path: 基本同path
- server: 服务端IP和账号
- client: 请求端IP和账号
- headers: 头信息,是个列表,有比较多的数据项。
- asgi: {'version': '3.0', 'spec_version': '2.1'},
- root_path: '',
- query_string: b'',
- path_params: {'item_id': '12121'}
其它还有:
URL —可通过request.url取得。包含如request.url.path , request.url.port , request.url.scheme 。
Headers -可通过request.headers取得 。 组件公开为不可变的,不区分大小写的多字典。 例如,您可以使用request.headers['content-type']从标头获取Content-Type 。
Query Parameters -可通过request.query_params 取得。 就像Headers一样,您可以使用request.query_params['search']访问查询参数
Path Parameters -可通过request.path_params 取得。 为字典。 例如, request.path_params['name']
Client Address -可通过request.client 取得。 为主机和端口保存一个命名的二元组。 您可以通过request.client.host和request.client.port获取详细信息。
Cookies -Cookies - 您可以使用request.cookies.get('cookiename')取得。
Body -返回的主体根据您的用例由多个接口组成。 为了获取字节数据,可以使用request.body() 。 表单数据或多部分数据作为request.form()发送。
在使用request.headers['content-type']取数据时,不建议这样使用,最好使用字典的get方法,因为有时是不存在这个key的,比如referer,如果这样取就会报错。