Skip to content

Latest commit

 

History

History
404 lines (282 loc) · 8.42 KB

550-589959-查询参数和字符串校验.sy.md

File metadata and controls

404 lines (282 loc) · 8.42 KB
show version enable_checker
step
1.0
true

fastapi

回忆

  • 上次我们研究了请求体
  • 请求体
    • 是使用POST或者PUT发送到服务器的json字典对象
    • 对应一个python类
  • 请求体对象也可以设置
    • 数据类型
    • 默认值
  • 请求体发送给服务器之后
    • 服务器可以进行处理
    • 再返回给浏览器一个json对象
  • 请求体可以配合
    • 路径参数
    • 查询参数

字符串参数

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/")
async def read_items(q: Union[str, None] = None):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • q是

    • 查询参数
    • 可选的
      • 默认值为None
  • 现在要增加验证

    • 字符串不能超过50个字符

引入Query包

  • 我们把默认值None
    • 换成了Query函数
from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=None, max_length=50)):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • 我们仍然能设置默认值
    • 用Query(default=None)
  • q 的默认值是Query()函数的结果
    • 说明q是一个查询参数
    • 函数Query的默认参数max_length为50
      • 需要验证max_length最大宽度为50
  • 除了max_length
    • 还可以有什么其它参数吗?

min_length

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(
    q: Union[str, None] = Query(default=None, min_length=3, max_length=50)
):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • 还可以设置min_length

运行结果

图片描述

  • q真的给个None的话

图片描述

  • 返回结果是字典
    • 其中的字典项是列表
    • 列表的列表项是字典
  • 如果q是给的字符串
  • 但是长度为2
  • 不满足min_length呢?

min_length

图片描述

  • 前端验证无法通过
  • 直接报错
  • 可以验证字符串的模式吗?

正则验证

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(
    q: Union[str, None] = Query(
        default=None, min_length=3, max_length=50, regex="^fixedquery$"
    )
):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • regex="^fixedquery$"
    • ^
      • 以该符号之后的字符开头
      • 符号之前没有字符
    • fixedquery
      • 值精确地等于 fixedquery
    • $
      • 到此结束
      • 在 fixedquery 之后没有更多字符

验证正则失败

图片描述

  • 不满足正则表达式要求的话
  • 前端验证出问题
  • 直接报错
  • 不会提交到服务器

验证正则成功

图片描述

  • 正确的参数可以验证成功
  • 发送请求到后端服务器
  • 后端服务器返回json对象

图片描述

默认非None参数

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: str = Query(default="fixedquery", min_length=3)):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • 可以为q设置非None的默认值

图片描述

设置必填项

  • 声明默认值可以设置参数为可选
    • q: str
    • q: Union[str, None] = Query(default=None, min_length=3)
  • 不声明默认值就可以设置参数为必填
    • q: str = None
    • q: str = Query(min_length=3

图片描述

  • 还有一种显式要求参数为必填项的方法
    • ...
    • Ellipsis
    • 省略号

图片描述

必填项但是默认为None

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=..., min_length=3)):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

用required代替...

from fastapi import FastAPI, Query
from pydantic import Required

app = FastAPI()


@app.get("/items/")
async def read_items(q: str = Query(default=Required, min_length=3)):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

查询参数里列表

  • 列表可以接受多个值
from typing import List, Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: Union[List[str], None] = Query(default=None)):
    query_items = {"q": q}
    return query_items

图片描述

带默认值的查询参数列表

from typing import List

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: List[str] = Query(default=["foo", "bar"])):
    query_items = {"q": q}
    return query_items
  • python3.9之后可以进一步优化
from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: list = Query(default=[])):
    query_items = {"q": q}
    return query_items

设置验证参数的说明

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(
    q: Union[str, None] = Query(
        default=None,
        title="Query string",
        description="Query string for the items to search in the database that have a good match",
        min_length=3,
    )
):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

图片描述

别名

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=None, alias="item-query")):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • 想用精准的item-query
  • 但这不符合python的小驼峰风格
  • 所以声明个别名

废弃的

  • deprecated就是废弃的
from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(
    q: Union[str, None] = Query(
        default=None,
        alias="item-query",
        title="Query string",
        description="Query string for the items to search in the database that have a good match",
        min_length=3,
        max_length=50,
        regex="^fixedquery$",
        deprecated=True,
    )
):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • 你不得不将其保留一段时间
  • 因为有些客户端正在使用它,但你希望文档清楚地将其展示为已弃用。

图片描述

总结🤔

  • 我们可以对于查询参数做出验证

    • alias
    • title
    • description
    • deprecated
  • 特定于字符串的校验:

    • min_length
    • max_length
    • regex
  • 下次再说👋