• FastAPI请求系列(二) 查询参数与字符串校验


    一、基本使用

     查询参数是什么呢?一般前台发送的请求可能是这样的 http://127.0.0.1:8000/items/?skip=0&limit=10 那么"?"之后的就是查询参数每个查询参数直接通过“&”进行连接。查询参数:

    • skip:值为0
    • limit:值为10

    那么在FastAPI的后台就需要进行接收。

    1、可选、非可选查询参数

    from fastapi import FastAPI
    
    app = FastAPI()
    
    
    @app.get("/query")
    async def page_limit(skip: int = 1, limit: int = 10):
        return {"skip": skip, "limit": limit}

    在上述实例中声明了两个查询参数的类型是int,并且都有自己的默认值,查询参数与路径参数不同,它不是路径的一部分,所以是可选的。你可以通过下面的请求方式均可:

    # 请求一
    http://127.0.0.1:8000/query
    
    # 请求二
    http://127.0.0.1:8000/query?skip=1   # limit值为空
    
    # 请求三
    http://127.0.0.1:8000/query?limit=10 # skip值为空
    
    # 请求四
    http://127.0.0.1:8000/query?skip=1&limit=10

    其最终的返回结果均是:

    {
      "skip": 1,
      "limit": 10
    }

    当然还可以通过类型声明来进行控制:

    from fastapi import FastAPI
    from typing import Optional
    
    app = FastAPI()
    
    
    @app.get("/query")
    async def page_limit(skip: Optional[int] = 1, limit: Optional[int] = 10):
        return {"skip": skip, "limit": limit}

    通过Optional来声明skiip查询参数是可选的int类型,并且默认值是1.。limit同理如此。但是这样用就和之前没有Optional的没啥区别了,所以一般可以这样使用:

    from fastapi import FastAPI
    from typing import Optional
    
    app = FastAPI()
    
    
    @app.get("/query")
    async def page_limit(skip: int = 1, limit: Optional[int] = None):
        if limit:
            return {"skip": skip, "limit": limit}
        return {"skip": skip}

    通过判断前台是否传递这个参数的值,来进行返回。

    在上述可选查询参数中注意:

    • 如果没有默认值就是必选(必填)参数
    • 如果有默认值就是可选(非必填)参数
    • 如果只是想成为可选参数而不想给一个特定的默认值,就使用Optional并且默认值为None

    2、bool类型转换 

    如果声明的查询参数是bool类型,它们将会被自动转换:

    from fastapi import FastAPI
    
    app = FastAPI()
    
    
    @app.get("/query/bool/conversion")
    async def type_conversion(param: bool = False):
        return param

    当访问以下路由:

    # 路由一
    http://127.0.0.1:8000/query/bool/conversion?param=yes
    
    # 路由二
    http://127.0.0.1:8000/query/bool/conversion?param=on
    
    # 路由三
    http://127.0.0.1:8000/query/bool/conversion?param=true
    
    # 路由四
    http://127.0.0.1:8000/query/bool/conversion?param=True
    
    # 路由五
    http://127.0.0.1:8000/query/bool/conversion?param=1

    返回值均为true。

    3、路径参数与查询参数

    上述只是单纯的查询参数,那么实际上路由中既可以有路径参数,同时也可以有查询参数。FastAPI可以识别它们,并且不需要特定的顺序。

    from fastapi import FastAPI
    from typing import Optional
    
    app = FastAPI()
    
    
    @app.get("/multi/params/{item_id}")
    async def multi_params(item_id: int, skip: int = 1, limit: Optional[int] = None):
        item = {"item_id":item_id,"skip":skip}
        if limit:
            item.update({"limit":limit})
        return item

    上述中:

    • item_id 是路径参数,是必填参数
    • skip 是查询参数,是选填参数,默认是1
    • limit 是查询参数,是选填参数,默认值是None

    二、进阶

    同路径参数中的Path类似,查询参数也提供了一个Query模块提供功能更加完善的参数校验。

    from fastapi import FastAPI
    from fastapi import Query
    from typing import List
    
    app = FastAPI()
    
    @app.get("/query/validations")
    def query_params_validate(
            value: str = Query(...,min_length=3,max_length=6,regex="^z"),
            values: List[str] = Query(["V1","V2"])
    ):
    
        return value,values

    上述中:

    • value 必选参数(存在"...")
    • values 非必选参数(存在默认值)

    调用接口:

     通过查看源码,更多校验参数:

    class Query(Param):
        in_ = ParamTypes.query
    
        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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    通过一个程序来理解PHP里面的抽象类【1】
    mycheckpoint 把玩手记
    Mysql 大量 unauthenticated user
    零基础学习Oracle 10G视频教程
    mysql show processlist命令 详解
    c# 中的事件
    c# 中方法签名 指的是?
    c# 中的索引
    介绍如何使用C#中的委托
    C# 语法学习笔记
  • 原文地址:https://www.cnblogs.com/shenjianping/p/14842179.html
Copyright © 2020-2023  润新知