数据类的 FastAPI 查询不适用于别名

Fab*_* Ba 0 alias python-3.x python-dataclasses pydantic fastapi

以下 FastAPI 代码对我产生了意想不到的行为:

import uvicorn
from fastapi import FastAPI, Depends, Query
from typing import Optional
from pydantic.dataclasses import dataclass


app = FastAPI()

@dataclass
class Catz:
    qqq: Optional[str] = Query(None, alias="q")

@app.get("/productz/")
def search_products(query: Catz = Depends(Catz)  ):
    products = [{"name": "Computer"}, {"name": "HDD"}]
    if not query.qqq:
        query.qqq = ""
    return {"query": query, "results": [product for product in products if query.qqq in product["name"]]}


@dataclass
class Cats:
    qqq: Optional[str] = Query(None )

@app.get("/products/")
def search_products(query: Cats = Depends(Cats)  ):
    products = [{"name": "Computer"}, {"name": "HDD"}]
    if not query.qqq:
        query.qqq = ""
    return {"query": query, "results": [product for product in products if query.qqq in product["name"]]}




if __name__ == "__main__":
    uvicorn.run("main:app", port=11978, log_level="info", reload=True)
Run Code Online (Sandbox Code Playgroud)

当我通过curl使用该服务时,我得到以下输出:

  1. 没有别名的端点 /products/ 的预期行为
>> curl -X 'GET'  'http://localhost:11978/products/?qqq=H'  -H 'accept: application/json' -H 'api-version: 1.0' ; echo
{"query":{"qqq":"H"},"results":[{"name":"HDD"}]}
Run Code Online (Sandbox Code Playgroud)
  1. 这不是没有别名的端点 /productz/ 的预期行为(无论我使用具有自己名称的查询参数还是使用代码中的别名)
>> curl -X 'GET'  'http://localhost:11978/productz/?qqq=H'  -H 'accept: application/json' -H 'api-version: 1.0' ; echo
{"query":{"qqq":""},"results":[{"name":"Computer"},{"name":"HDD"}]}

>> curl -X 'GET'  'http://localhost:11978/productz/?q=H'  -H 'accept: application/json' -H 'api-version: 1.0' ; echo
{"query":{"qqq":""},"results":[{"name":"Computer"},{"name":"HDD"}]}
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?

Mat*_*ndh 5

不要导入dataclasspydantic.dataclasses- 它应该从 Python 自己的内置dataclasses模块导入:

from fastapi import FastAPI, Depends, Query
from fastapi.exceptions import RequestValidationError
from dataclasses import dataclass
from typing import Optional


app = FastAPI()


@dataclass
class Catz:
    qqq: Optional[str] = Query(None, alias="q")

    
@app.get("/productz/")
def search_products(query: Catz = Depends()):
    products = [{"name": "Computer"}, {"name": "HDD"}]
    if not query.qqq:
        query.qqq = ""
    return {"query": query, "results": [product for product in products if query]}
Run Code Online (Sandbox Code Playgroud)

输出/productz?q=123

{"query":{"qqq":"123"},"results":[{"name":"Computer"},{"name":"HDD"}]}
Run Code Online (Sandbox Code Playgroud)