赞
踩
需求场景
假设现在我们有个图书网站,需要客户端在请求头上携带有效的token,才可以获取图书数据,那FastAPI该如何获取客户端传过来的请求头参数呢?
FastAPI的解决方式
示例1:FastAPI获取 指定请求头的值(比如,请求头的key是 token
)
from fastapi import FastAPI, Header
app = FastAPI()
books = {
i: f"图书{
i}" for i in range(10)}
@app.get("/books/{id}")
def get_book_by_id(id: int, token: str = Header()):
if token == "this-is-token":
return books.get(id)
else:
return "invalid token"
补充1:就和使用Path(), Query()类似,Header()也具有基本的请求头参数校验和API文档设置的功能
补充2:如果定义的参数是请求头参数,则必须使用Header(),否则FastAPI默认会把这个参数识别为查询参数
示例2:请求头参数可以有多个值,使用Header()默认只获取第一个值,使用typing.List[]
来获取多有的值
import typing
from fastapi import FastAPI, Header
app = FastAPI()
books = {
i: f"图书{
i}" for i in range(10)}
@app.get("/books/{id}")
def get_book_by_id(id: int, token: typing.List[str] = Header()):
return token
比如下面的请求,则返回:
["foo", "bar"]
curl -X 'GET' \ 'http://127.0.0.1:8000/books/2' \ -H 'accept: application/json' \ -H 'token: foo,bar'
- 1
- 2
- 3
- 4
示例3:使用 convert_underscores
设置转换连接符,默认为 True
from fastapi import FastAPI, Header
app = FastAPI()
books = {
i: f"图书{
i}" for i in range(10)}
@app.get("/books/{id}")
def get_book_by_id(id: int, x_token: str = Header()):
if x_token == "this-is-token":
return books.get(id)
else:
return "invalid token"
补充1:因为默认在请求头中参数一般使用
-
做连接符,比如:x-token
, 但是Python中使用_
,所以这中间一般需要做一个转化。补充2:请求头也可以使用
_
,但是一般会使用-
需求场景
向服务请提交数据,可以通过路径参数,查询参数,也可以在请求体中携带数据(推荐)
推荐使用请求体向服务器提交数据的原因:
那我们该如何使用请求体向服务端提交数据呢?一般有两种方式:
使用POST请求,在请求体中使用JSON格式的数据;PUT/PATCH等也可以在请求体中使用JSON格式数据
使用POST请求,在请求体中使用form-data格式的数据,提交数据(即前端的form表单,第6章详细介绍)
上述两种方式,在一个接口中不能同时使用
示例1:使用POST请求,提交JSON格式的数据(使用postman)
需求场景
知道了客户端需要通过请求体给服务端传数据,那在FastAPI中该如何获取客户端端传过来的请求体数据呢?
本节课我们先来看下FastAPI中如何获取JSON格式的请求体数据
在第6章我们再详细介绍如何获取表单数据
比如,现在需要一个登录接口/login
,POST方式,请求体为,
{
"username": "liuxu",
"password": "liuxu"
}
FastAPI使用Pydantic来接收请求体数据
上面这种情况下,FastAPI分三步来实现获取请求体参数:
BaseModel
,定义模型类 User
,在类中定义两个和请求体字段同名的类属性并做类型提示user
,并设置类型为 User
user
属性username
和password
获取请求体字段的值from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class User(BaseModel): username: str password: str @app.post("/login") def login(user: User): return { "username": user.username, "password": user.password }
这样做可以帮我们获取请求体参数并赋值到参数user
,同时背后会做这些事情,
结论:
BaseModel
的方式来获取数据BaseModel
的子类中定义的类属性是用来匹配请求体对应的字段值,所以名字包保持一致,字段的顺序没有要求BaseModel
的子类,则FastAPI会默认会把请求体数据保存在这个变量中需求场景
有的时候,客户端向后端提交的请求体数据可能是如下格式,此时该如何获取数据呢?
{
"user": {
"username": "liuxu",
"password": "liuxu"
}<
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。