首页 > 解决方案 > fastapi 上是否有任何查询约束异常?

问题描述

我正在使用 fastapi 0.70.0 和 python 3.8.10。

我期待 Query 在查询 /items/0 时引发 RequestValidationError (或其他东西)(因为 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}

几个查询:

第 1 项:有效查询:

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

项目 a:例外,“a”不是整数:

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

第 0 项:未引发异常,0 不允许。

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

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

标签: pythonfastapipydantic

解决方案


没有这样的键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}

推荐阅读