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使用该服务时,我得到以下输出:
>> 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)
>> 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)
知道为什么会这样吗?
不要导入dataclass自pydantic.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)
| 归档时间: |
|
| 查看次数: |
1146 次 |
| 最近记录: |