当前位置:   article > 正文

FastAPI Web框架教程 第3章 请求头和请求体_fastapi 获取header

fastapi 获取header

3.1 使用Header接收请求头参数

需求场景

假设现在我们有个图书网站,需要客户端在请求头上携带有效的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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

补充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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

比如下面的请求,则返回:["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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

补充1:因为默认在请求头中参数一般使用 - 做连接符,比如:x-token, 但是Python中使用 _,所以这中间一般需要做一个转化。

补充2:请求头也可以使用_,但是一般会使用 -

3.2 使用请求体提交数据

需求场景

向服务请提交数据,可以通过路径参数,查询参数,也可以在请求体中携带数据(推荐)

推荐使用请求体向服务器提交数据的原因:

  • 路径参数和查询参数携带的数据量有限
  • 路径参数和查询参数携带数据不安全

那我们该如何使用请求体向服务端提交数据呢?一般有两种方式:

  • 使用POST请求,在请求体中使用JSON格式的数据;PUT/PATCH等也可以在请求体中使用JSON格式数据

  • 使用POST请求,在请求体中使用form-data格式的数据,提交数据(即前端的form表单,第6章详细介绍)

  • 上述两种方式,在一个接口中不能同时使用

示例1:使用POST请求,提交JSON格式的数据(使用postman)

在这里插入图片描述

3.3 使用Pydantic接收请求体数据

需求场景

知道了客户端需要通过请求体给服务端传数据,那在FastAPI中该如何获取客户端端传过来的请求体数据呢?

  • 本节课我们先来看下FastAPI中如何获取JSON格式的请求体数据

  • 在第6章我们再详细介绍如何获取表单数据

比如,现在需要一个登录接口/login,POST方式,请求体为,

{
   
    "username": "liuxu",
    "password": "liuxu"
}
  • 1
  • 2
  • 3
  • 4
  • 5

FastAPI使用Pydantic来接收请求体数据

上面这种情况下,FastAPI分三步来实现获取请求体参数:

  • 第一步:继承Pydantic的 BaseModel,定义模型类 User ,在类中定义两个和请求体字段同名的类属性并做类型提示
  • 第二步:在路径函数中定义形参 user,并设置类型为 User
  • 第三步:通过对象user属性usernamepassword获取请求体字段的值
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
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这样做可以帮我们获取请求体参数并赋值到参数user,同时背后会做这些事情,

  • (1)按照json格式来读取请求体数据
  • (2)类型转换和类型校验
  • (3)把请求体中每个字段的值赋值到模型类对象的每个属性
  • (4)API文档

结论

  • 如果请求体参数是JSON格式,就通过继承Pydantic的 BaseModel 的方式来获取数据
  • BaseModel的子类中定义的类属性是用来匹配请求体对应的字段值,所以名字包保持一致,字段的顺序没有要求
  • 只要路径函数式中形参的类型是BaseModel的子类,则FastAPI会默认会把请求体数据保存在这个变量中
  • 定义的模型类的属性,可以有默认值

3.4 多个请求体参数

需求场景

有的时候,客户端向后端提交的请求体数据可能是如下格式,此时该如何获取数据呢?

{
   
    "user": {
   
        "username": "liuxu",
        "password": "liuxu"
    }<
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/912061
推荐阅读
相关标签
  

闽ICP备14008679号