gpt4 book ai didi

python - 自定义 fastapi 查询参数验证

转载 作者:行者123 更新时间:2023-12-02 15:50:48 24 4
gpt4 key购买 nike

有没有办法在 FastAPI 查询参数中使用自定义验证逻辑?

示例

我有一个 FastAPI带有一堆请求处理程序的应用程序,将 Path 组件作为查询参数。例如:

def _raise_if_non_relative_path(path: Path):
if path.is_absolute():
raise HTTPException(
status_code=409,
detail=f"Absolute paths are not allowed, {path} is absolute."
)

@app.get("/new",)
def new_file(where: Path):
_raise_if_non_relative_path(where)
# do save a file
return Response(status_code=requests.codes.ok)

@app.get("/new",)
def delete_file(where: Path):
_raise_if_non_relative_path(where)
# do save a file
return Response(status_code=requests.codes.ok)

我想知道是否有办法确保在给定文件路径是绝对路径时甚至不调用处理程序。现在我必须在所有地方重复 _raise_if_non_relative_path

我尝试过的

  • fastapi.Query:
    这只允许非常基本的验证(字符串长度和正则表达式)。我可以在这个例子中定义一个绝对路径正则表达式。但是正则表达式解决方案确实不是通用的,我想使用自定义函数进行验证。
  • 子类 pathlib.Path,在 __init__ 中具有验证逻辑:
    这不起作用,类型签名中给出的类型被忽略,我的处理程序中的对象是一个常规的 pathlib.PosixPath
  • 使用@app.middleware:
    这可以工作,但似乎有点矫枉过正因为并非我所有的请求处理程序都处理 Path 对象。
  • 类 RelativePath(pydantic.Basemodel):
    IE。定义一个具有单个 path 字段的类,我可以根据需要对其进行验证。不幸的是,这不适用于查询参数。如果我这样做,请求处理程序坚持要有一个 json 内容主体。或者至少 swagger 文档是这么说的。

最佳答案

这是一种验证 the Depends dependency management function非常适合。它允许您为给定的 View 函数定义依赖关系,并添加逻辑来验证(和懒惰地创建)这些依赖关系。这提供了一组可组合的依赖项,可以在需要它们的那些 View 中重复使用。

您可以创建一个relative_where_query 依赖项,然后依赖它来执行任何所需的验证:

from fastapi import Depends, FastAPI, Response, Query
from fastapi.exceptions import HTTPException
from pathlib import Path
import requests

app = FastAPI()

def relative_where_query(where: Path = Query(...)):
if where.is_absolute():
raise HTTPException(
status_code=409,
detail=f"Absolute paths are not allowed, {where} is absolute."
)

return where

@app.get("/new")
def new_file(where: Path = Depends(relative_where_query)):
return Response(status_code=requests.codes.ok)

这提供了小的、易于阅读(和理解)的 View 函数,而依赖项(“我需要一个来自 where 查询参数的相对路径”)已被移动到它自己的定义中。

然后,您可以在每个需要来自 where 查询参数的相对路径的 View 函数中重新使用此依赖项(如果需要,您可以进一步分解和重组这些依赖项)。

关于python - 自定义 fastapi 查询参数验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72560837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com