5.FastAPI显式声明参数

Posted Janeh1018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.FastAPI显式声明参数相关的知识,希望对你有一定的参考价值。

5.FastAPI显式声明参数

FastAPI允许显式声明参数属于查询参数、路径参数或者请求体;同时还可以为参数声明默认值、额外的信息及校验;也允许显式声明可选参数;

5.1可选参数

可选参数的显式声明使用 typing. Optional来声明;代码如下:

# coding: utf-8

from typing import Optional
from fastapi import FastAPI

app = FastAPI()

@app.get(path=/add/vara/varb)
async def add(vara: int, varb: int, x: Optional[int]=2, y: Optional[int] = 5):
    return added: vara + varb, multiply: x * y

执行请求:

curl http://127.0.0.1:8000/add/1/2
"added":3,"multiply":10

5.2查询参数

查询参数使用fastapi的Query来声明,声明时可以指定默认值,代码如下:

from typing import Optional
from fastapi import FastAPI
from fastapi import Query

app = FastAPI()

@app.get(path=/add/vara/varb)
async def add(vara: int, varb: int, x: Optional[int]=Query(2), y: Optional[int]=Query(5)):
    return added: vara + varb, multiply: x * y

上面的代码中使用 Query(2) 替换默认值 2,Query 的第一个参数也是用于定义默认值的,当使用Query声明必须参数时,可以将 ... 用作第一个参数值,代码如下:

from fastapi import FastAPI
from fastapi import Query

app = FastAPI()

@app.get(path=/add/vara/varb)
async def add(vara: int, varb: int, x: int=Query(...), y: int=Query(...)):
    return added: vara + varb, multiply: x * y

执行请求:

curl http://127.0.0.1:8000/add/1/2

    "detail":[
        
            "loc":["query","x"],
            "msg":"field required",
            "type":"value_error.missing"
        ,
            "loc":["query","y"],
            "msg":"field required",
            "type":"value_error.missing"
        
    ]

5.3路径参数

路径参数使用fastapi的Path来声明。由于路径参数是路径的一部分,所以路径参数一定是必需的。在声明路径参数时使用 ... 将其标记为必需参数。但实际上,即使使用 None 声明路径参数或设置一个其他默认值也不会有任何影响,仍然会是必需参数。代码如下:

from typing import Optional
from fastapi import FastAPI
from fastapi import Query
from fastapi import Path

app = FastAPI()

@app.get(path=/add/vara/varb)
async def add(vara: int=Path(...), varb: int=Path(...), x: Optional[int]=Query(2), y: Optional[int]=Query(5)):
    return added: vara + varb, multiply: x * y

执行请求:

curl http://127.0.0.1:8000/add/1/2
"added":3,"multiply":10

5.4请求体

路径参数使用fastapi的Body来声明。当在请求体中出现单一值而不是对象时,使用Body显式声明为请求体是有必要的。代码如下:

from fastapi import FastAPI
from pydantic import BaseModel

class Add(BaseModel):
    a: int
    b: int

class Mul(BaseModel):
    x: int
    y: int

app = FastAPI()

@app.post(path=/calc)
async def calc(add: Add, mul: Mul, index: int):
    return added: add.a + add.b, multiply: mul.x * mul.y, index: index

执行请求:

curl -H "Content-Type: application/json" -X POST -d "\\"add\\": \\"a\\":2, \\"b\\":3, \\"mul\\": \\"x\\":2, \\"y\\":3, \\"index\\": 1018" http://127.0.0.1:8000/calc

    "detail":[
        
            "loc":["query","index"],
            "msg":"field required",
            "type":"value_error.missing"
        
    ]

上面的代码中,index参数被解析为查询参数,所以在执行请求时会报错,将代码修改如下:

from fastapi import FastAPI
from fastapi import Body
from pydantic import BaseModel

class Add(BaseModel):
    a: int
    b: int

class Mul(BaseModel):
    x: int
    y: int

app = FastAPI()

@app.post(path=/calc)
async def calc(add: Add, mul: Mul, index: int=Body(...)):
    return added: add.a + add.b, multiply: mul.x * mul.y, index: index

执行请求:

curl -H "Content-Type: application/json" -X POST -d "\\"add\\": \\"a\\":2, \\"b\\":3, \\"mul\\": \\"x\\":2, \\"y\\":3, \\"index\\": 1018" http://127.0.0.1:8000/calc
"added":5,"multiply":6,"1018":1018

对于单个请求体来说,路由的请求体直接使用字段的key/value即可,但对于多个请求体,就向上面的例子,路由的请求体必须是嵌套式的,具体如下:

单个请求体,类似于:

 
    "key1": "value1",    
    "key2": "value2",
    ......    
 

多个请求体,类似于:


    "key_1": 
        "key1": "value1",    
        "key2": "value2",
        ......    
    ,
    "key_2": 
        "key1": "value1",    
        "key2": "value2",
        ......    
    ,
    ......

如果希望单个请求体也使用嵌套式,则在声明Body时,使用embed参数,代码如下:

from fastapi import FastAPI
from fastapi import Body
from pydantic import BaseModel

class Add(BaseModel):
    a: int
    b: int

app = FastAPI()

@app.post(path=/calc)
async def calc(add: Add=Body(..., embed=True)):
    return added: add.a + add.b

执行请求:

curl -H "Content-Type: application/json" -X POST -d "\\"a\\":2, \\"b\\":3" http://127.0.0.1:8000/calc

    "detail":[
        
            "loc":["body","add"],
            "msg":"field required",
            "type":"value_error.missing"
        
    ]

curl -H "Content-Type: application/json" -X POST -d "\\"add\\": \\"a\\":2, \\"b\\":3" http://127.0.0.1:8000/calc
"added":5

5.5请求体字段的显式声明

请求体中的字段可以使用Pydantic的Field在Pydantic模型定义时声明。 Field 是直接从pydantic导入的,而不像Query、Path和Body 都从 fastapi 导入的。

from typing import Optional
from fastapi import FastAPI
from fastapi import Body
from pydantic import BaseModel
from pydantic import Field

class Add(BaseModel):
    a: Optional[int] = Field(1)
    b: int = Field(...)

app = FastAPI()

@app.post(path=/calc)
async def calc(add: Add=Body(..., embed=True)):
    return added: add.a + add.b

执行请求:

curl -H "Content-Type: application/json" -X POST -d "\\"add\\": \\"b\\":5" http://127.0.0.1:8000/calc
"added":6

5.6参数的附加信息

参数的附加信息主要用于API文档。

元数据:

  • alias 别名,当参数名称是一个非 有效的 Python 变量名称时,可以使用alias标识别名
  • title 标题
  • description 描述
  • deprecated 启用,当参数在一段时间内保留,但希望文档中标识为已弃用时使用

代码示例:

from typing import Optional
from fastapi import FastAPI
from fastapi import Body
from pydantic import BaseModel
from pydantic import Field

class Add(BaseModel):
    a: Optional[int] = Field(1, title=参数a, description=加数, alias=x)
    b: int = Field(..., title=参数b, description=被加数, alias=y)

app = FastAPI()

@app.post(path=/calc)
async def calc(add: Add=Body(..., embed=True)):
    return added: add.a + add.b

API文档

5.FastAPI显式声明参数_json

执行请求:

curl -H "Content-Type: application/json" -X POST -d "\\"add\\": \\"x\\":2,\\"y\\":5" http://127.0.0.1:8000/calc
"added":7

5.7参数的校验

声明字符串校验:

  • min_length 最大长度
  • max_length 最小长度
  • regex 正则表达式

声明数值校验:

  • gt:大于(greater than)
  • ge:大于等于(greater than or equal)
  • lt:小于(less than)
  • le:小于等于(less than or equal)

代码示例:

from typing import Optional
from fastapi import FastAPI
from fastapi import Body
from fastapi import Query
from pydantic import BaseModel
from pydantic import Field

class Add(BaseModel):
    a: Optional[int] = Field(1, title=参数a, description=加数, alias=x, gt=100)
    b: int = Field(..., title=参数b, description=被加数, alias=y, ge=200)

app = FastAPI()

@app.post(path=/calc)
async def calc(add: Add=Body(..., embed=True), desc:str=Query(..., min_length=3, max_length=10)):
    return desc: add.a + add.b

执行请求:

curl -H "Content-Type: application/json" -X POST -d "\\"add\\": \\"x\\":2,\\"y\\":5" http://127.0.0.1:8000/calc?desc=ad

    "detail":[
        
            "loc":["query","desc"],
            "msg":"ensure this value has at least 3 characters",
            "type":"value_error.any_str.min_length",
            "ctx":
                "limit_value":3
            
        ,
        
            "loc":["body","add","x"],
            "msg":"ensure this value is greater than 100",
            "type":"value_error.number.not_gt",
            "ctx":
                "limit_value":100
            
        ,
            "loc":["body","add","y"],
            "msg":"ensure this value is greater than or equal to 200",
            "type":"value_error.number.not_ge",
            "ctx":
                "limit_value":200
            
        
    ]

curl -H "Content-Type: application/json" -X POST -d "\\"add\\": \\"x\\":260,\\"y\\":500" http://127.0.0.1:8000/calc?desc=add
"add":760


以上是关于5.FastAPI显式声明参数的主要内容,如果未能解决你的问题,请参考以下文章

C# 委托 线程

Android Fragment 在布局中声明,如何设置参数?

布局中声明的Android Fragment,如何设置参数?

Thymeleaf引用片段传入参数

利用反射创建对象必须要显式的声明构造方法吗?

如何在 Django 中显式重置模板片段缓存?