fastapi有查询约束异常吗?



我使用fastapi 0.70.0, python 3.8.10。

我期待查询引发RequestValidationError(或其他)时查询/项/0(因为0不是gte=1)

我采用fastapi样例代码,添加查询参数约束(不允许项目0):

from fastapi import FastAPI, HTTPException, Query
from fastapi.exceptions import RequestValidationError
from fastapi.responses import PlainTextResponse
app = FastAPI()
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
return PlainTextResponse(str(exc), status_code=400)
@app.get("/items/{item_id}")
async def read_item(item_id: int = Query(default=1, gte=1)):             # /! Important line.
if item_id == 3:
raise HTTPException(status_code=418, detail="Nope! I don't like 3.")
return {"item_id": item_id}

几个查询:

item 1: A valid query:

curl http://127.0.0.1:8000/items/1             # Return item_id as expected.
{"item_id": 1}

item a: Exception, "a">

curl http://127.0.0.1:8000/items/a             # RequestValidationError as expected

item 0: No Exception raise, 0 not allowed.

curl http://127.0.0.1:8000/items/0             # ô_O, no exception, 0 is not gte=1 
{"item_id": 0}

那么,如果没有引发异常,查询约束还不可用吗?

不存在gte这个键。您需要使用:

  • gt-大于
  • ge-大于等于

号码验证

@app.get("/items/{item_id}")
async def read_item(item_id: int = Query(default=1, ge=1)):             # /! Important line.
if item_id == 3:
raise HTTPException(status_code=418, detail="Nope! I don't like 3.")
return {"item_id": item_id}

参数定义为ge: Optional[float] = None,,不是gte:

from fastapi import FastAPI, Query
app = FastAPI()
@app.get('/')
async def get_magic(a: int = Query(default=1, ge=1)):
return {'foo': a}

if __name__ == '__main__':
import uvicorn
uvicorn.run('foo:app', port=4008, reload=True)

?a=0调用这个函数会得到预期的错误:

{"detail":[{"loc":["query","a"],"msg":"ensure this value is greater than or equal to 1","type":"value_error.number.not_ge","ctx":{"limit_value":1}}]}

最新更新