zoukankan      html  css  js  c++  java
  • FastAPI请求系列(一) 路径参数与数值校验

    一、基本使用

    1、基本路径参数

    如下:

    from fastapi import FastAPI
    
    app = FastAPI()
    
    
    @app.get("/item/{item_id}")
    async def read_item(item_id: int):
        return {"item_id": item_id}

    上面黄色部分包含路径、操作,其中:

    • /item/{item_id}   被称为路径
    • get 被称为操作,表示一种HTTP的方法(比如,POST/PUT/DELETE等)

    {item_id}作为路径中的参数,其值将作为参数item_id传递给函数。

      在函数中标明了路径参数应该接受什么类型的参数,这种类型的声明会进行数据校验,比如输入不符合的参数值:

    {
      "detail": [
        {
          "loc": [
            "path",
            "item_id"
          ],
          "msg": "value is not a valid integer",
          "type": "type_error.integer"
        }
      ]
    }

    会出现错误的提示信息,包括出错的位置信息等。

    2、路径顺序

    如果有多个路径时,注意它们的顺序,因为请求是按照顺序来进行匹配的,比如:

    from fastapi import FastAPI
    
    app = FastAPI()
    
    @app.get("/path/parameters")
    def path_params_1():
        return {"message":"This is path_params_1"}
    
    @app.get("/path/{parameters}")
    def path_params_2(parameters:str):
        return {"message":parameters}

    上面的两个接口,如果调用第二个接口,并且传入的值为parameters,那么就会匹配到第一个接口,所以在开发中注意调整接口的顺序。

    3、枚举值

    显然上述的参数都是自己来进行输入的,至于输入什么接口是无从得知的,那么枚举值就是用来进行值的预设。

    from fastapi import FastAPI
    from enum import Enum
    
    app = FastAPI()
    
    class CityName(str,Enum):
        Xian = "Xian china"
        Shanghai = "Shanghai china"
    
    @app.get("/enum/{city}")
    async def city_info(city:CityName):
        if city == CityName.Xian:
            return {"info":city}
        if  city == CityName.Shanghai:
            return {"info":city}

    上述中实现预设值:

    • 定义你需要给接口的预设值的类
    • 使用定义的枚举类创建类型标注的路径参数

    这样交互式文档中就有预设值:

    4、包含路径的路径参数 

    当路径参数传递的是一个路径时,FastAPI又如何解析呢?比如上传文件的路径。

    from fastapi import FastAPI
    
    # 包含路径
    @app.get("/file/{file_path:path}")
    async def read_file(file_path:str):
        return {"file_path":file_path}

    可以通过路径转换器,在file_path这个路径参数后面通过:path来指明匹配的是任意路径。

    二、进阶

    上面对路径参数的校验是通过简单的类型校验,如果想进行更为复杂的校验需要用到Path 模块。

    from fastapi import FastAPI
    from fastapi import Path
    
    app = FastAPI()
    
    @app.get("/path/{num}")
    def path_params_validate(
            num:int = Path(...,title="input your num",description="description num",ge=1,le=5 ) 
    ):
        return num

    路径参数是路径的一部分,所以它是必需的,通过"..."将其标记为必需参数,即使默认值给的是None依然是必需参数。可以通过查看Path方法查看传递的更多参数:

    class Path(Param):
        in_ = ParamTypes.path
    
        def __init__(
            self,
            default: Any,
            *,
            alias: Optional[str] = None,
            title: Optional[str] = None,
            description: Optional[str] = None,
            gt: Optional[float] = None,
            ge: Optional[float] = None,
            lt: Optional[float] = None,
            le: Optional[float] = None,
            min_length: Optional[int] = None,
            max_length: Optional[int] = None,
            regex: Optional[str] = None,
            example: Any = Undefined,
            examples: Optional[Dict[str, Any]] = None,
            deprecated: Optional[bool] = None,
            **extra: Any,
        ):
    ...
    ...

    可以看到里面的验证参数很全,除了常用的一些,另外还可以通过正则进行验证。

    作者:iveBoy
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    bootstrap收费模版,里面也有后台模版
    漂亮的后台设计
    table ie td宽度 bug
    何让WordPress博客首页不显示某分类的所有文章?
    WordPress不同分类使用不同列表样式
    wordpress学习笔记(一)
    Chariot主题是一款专业自适应Wordpress作品主题
    洛谷P1450 [HAOI2008]硬币购物 动态规划 + 容斥原理
    洛谷P2671 求和 数学 前缀和
    洛谷1288 取数游戏II 博弈论
  • 原文地址:https://www.cnblogs.com/shenjianping/p/14841743.html
Copyright © 2011-2022 走看看