FastApi学习-02

URL路径参数

@app.get("/param_get1/{param}")  # 以大括号包裹,默认是字符串类型,在路径中获取参数
def param_get1(param):
    return {"param": param}


@app.get("/param_get2/{param}")  # 可以指定数据类型,会进行数据类型转化
def param_get2(param: int):
    return {"param": param}

在param_get2方法中,声明了数据类型为int型,当访问的路径为”/param_get2/123“时,方法param变量的值为int型的123。当传入的是一个不可转化的数据类型时,例如"/param_get2/abc"时,接口会返回一个code为422(无法处理的实体)。

@app.route("/param_get3/me")
def param_get3():
    return {"param": "me"}


@app.route("/param_get3/{param}")
def param_get4(param):
    return {"param": param}

param_get4定义的路径其实是包含param_get3定义的路径的,这种情况,不存在变量的路径一定要在存在变量的路径之前定义

class items(str, Enum):
    a = "a"
    b = "b"
    c = "c"


@app.get("/param_get5/{param}")
def param_get5(param: items):
    return {"param": param}

当我们希望参数在一定范围内的时候,可以适用上述的形式,定义一个枚举类,声明参数在这个范围内,如果参数超过这个范围,抛出422异常

@app.get("/param_get6/{file_path: path}")
def param_get6(file_path):
    return {"file_path": file_path}

当我们需要参数是一个路径的形式的时候,需要在路径中声明,而不是在接口函数中声明,声明的方式如上

Query参数

@app.get("/param_query1")
def param_query1(a, b):  # 默认是str类型
    return [a, b]


@app.get("/param_query2")
def param_query2(a: int, b: float):  # 声明数据类型
    return [a, b]


@app.get("/param_query3")
def param_query3(a: int = 1, b: float = 2.3):  # 给参数声明了默认值
    return [a, b]

默认的是str的数据类型,也可以自己指定数据类型,也可以给参数赋予默认值。当参数声明默认值之后,该参数成为非必传参数,如果未设置默认值(默认值可以为None),该参数必传,否则返回422,提示参数丢失。

Request Body参数

from pydantic import BaseModel

class User(BaseModel):
    name: str
    age: int = 18

@app.post("/param_request_body1")
def param_request_body1(user: User):
    return user

request_body的方式不支持Http-Get方法。

引入了pydantic的BaseModel来接受request_body,如果在方法中声明的int类型,则接收的是query参数。

在User的声明中,name未设置默认值,age设置了默认值,则name为request_body中的必要参数,age为非必要,如果不传,则获取其默认值。

可以混合query参数和path参数

Path和Query的数据校验

FastApi对于接受的参数提供了一定的数据检验功能,可通过Path和Query来进行数据的检验。FastApi还提供了Header,Cookie,Body,Form,File,Security,Depends等参数的简要功能,这里只简单介绍下Path和Query的功能

# 数据校验
from fastapi import Query, Path

@app.get("/param_validate1/{item}")
def param_validate1(item: int = Path(1, description = "描述", ge = 10)):
    return {"item": item}

@app.get("/param_validate2")
def param_validate2(item: int = Query(1, description = "query参数", le = 10)):
    return {"item": item}

@app.get("/param_validate3")
def param_validate3(item: int = Query(..., description = "query参数", le = 10)):
    return {"item": item}

Path和Query的方法相近,所以介绍一个就行。上文提到过必要参数和非必要参数的区别,在这里适用Query的检验,第一个参数设置成默认值,就是有默认值的非必要参数,如果设置成”...“就是必要参数。

描述类的参数:

title和description用于描述参数的名称与介绍

alias_name相当于一个和参数名(item)的映射,主要用于参数名不合法的情况,例如使用参数名(item-name)。

deprecated用于表示该接口是否弃用。

对于int类型的参数,可以适用lt(小于),le(小于等于),gt(大于),ge(大于等于)四个方法来校验数据的数值范围。

@app.get("/param_validate4")
def param_validate4(item: str = Query(..., description="字符串长度限制", min_length = 3)):
    return {"item": item}

@app.get("/param_validate5")
def param_validate5(item: str = Query(..., description="正则表达式", regex=r"[0-7]+")):

对于str类型的参数,可以适用min_length,max_length来限制字符串的长度,也可以使用正则表达式规范字符串。

@app.get("/param_validate6")
def param_validate6(item: List[str] = Query(None)):
    return {"item": item}

@app.get("/param_validate7")
def param_validate7(item: List[str] = Query(["a", "b"])):
    return {"item": item}

Query参数也可以获取数组类的参数,可以设置默认值,也可以设置必要参数。接口调用的方式类似与/param_validate7?item=1&item=2&item=3,后台获取的参数为数组["1", "2", "3"]


@app.get("/param_validate8")
def param_validate8(t1: str = None, t2: str):
    return [t1, t2]

@app.get("/param_validate9")
def param_validate9(*, t1: str = None, t2: str):
    return [t1, t2]

@app.get("/param_validate10")
def param_validate10(t1: str = None, t2: str = Query(...)):
    return [t1, t2]

当有多个参数的时候要考虑参数的顺序,上述代码中param_validate8的方法会报错,因为参数中有默认值的参数定义在没有默认值参数的前面,这在python中是不允许的。

方案一:变更顺序为合法的,没有默认值在前,有默认值在后。

方案二:在参数声明时第一位加上"*"

方案三:使用Query,Path等声明。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章