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)

当我通过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"}]}
  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"}]}

知道为什么会这样吗?

不要从pydantic.dataclasses中导入dataclass-它应该从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]}

/productz?q=123的输出:

{"query":{"qqq":"123"},"results":[{"name":"Computer"},{"name":"HDD"}]}

最新更新