FastAPI: Pydantic을 사용하여 쿼리 매개변수를 선언하는 방법

Linda Hamilton
풀어 주다: 2024-10-10 06:11:30
원래의
851명이 탐색했습니다.

FastAPI에서 가장 기대되는 기능 중 하나가 약 3주 전에 나왔습니다. 적어도 Pydantic Models FastAPI에 관해 이야기할 때는 말이죠.

예, Pydantic 모델을 사용하여 쿼리 매개변수를 매핑하는 기능에 대해 이야기하고 있습니다.

그래서 이번 포스팅에서는 여러분께 다 보여드리려고 ? 할 수 있고? 이 주제에 대해 할 수 없나요?:

? 쿼리 매개변수 매핑

Pydantic으로 쿼리 매개변수 매핑을 시작하기 위해 가장 먼저 해야 할 일은 FastAPI 버전 0.115.0을 사용하고 있는지 확인하는 것입니다.

이후 언제든지 FastAPI 문서로 이동하여 이미 사용 가능한 항목을 확인할 수 있습니다. Sebastián과 팀원들은 문서를 최신 상태로 유지하고 유익한 정보를 제공하는 데 정말 훌륭한 일을 해냈습니다 ✨.

? 약간의 역사

FastAPI에서 쿼리 매개변수를 매핑하는 데 사용한 방법에 대한 몇 가지 예부터 시작하겠습니다. ?

가장 간단한 방법은 다음과 같습니다.

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def search(
    limit: int | None = 10,
    skip: int | None = 1,
    filter: str | None = None
):
    return {
        "limit": limit,
        "skip": skip,
        "filter": filter
    }
로그인 후 복사

이제 간단히 전화를 걸 수 있습니다.

GET http://localhost:8000/?limit=42&skip=12&filter=banana
로그인 후 복사

그러나 이 쿼리 매개변수가 다른 경로에서 사용될 것이라고 식별한 경우 다음과 같이 이를 격리합니다.

from typing import Any
from fastapi import Depends, FastAPI, Query

app = FastAPI()

async def pagination_query_string(
    limit: int | None = Query(10, ge=5, le=100),
    skip: int | None = Query(1, ge=1),
    filter: str | None = Query(None)
) -> dict[str, Any]:
    return {
        "limit": limit,
        "skip": skip,
        "filter": filter
    }

@app.get("/")
async def search(q: dict[str, Any] = Depends(pagination_query_string)):
    return q
로그인 후 복사

또는 Pydantic을 사용하여 모델을 매핑하므로 약간의 리팩토링만으로 다음을 얻을 수 있습니다.

from fastapi import Depends, FastAPI, Query
from pydantic import BaseModel

app = FastAPI()

class PaginationQueryString(BaseModel):
    limit: int | None = 10
    skip: int | None = 1
    filter: str | None = None

async def pagination_query_string(
    limit: int | None = Query(10, ge=5, le=100),
    skip: int | None = Query(1, ge=1),
    filter: str | None = Query(None)
) -> PaginationQueryString:
    return PaginationQueryString(
        limit=limit,
        skip=skip,
        filter=filter
    )

@app.get("/")
async def search(q: PaginationQueryString = Depends(pagination_query_string)):
    return q
로그인 후 복사

⌨️ Pydantic을 사용하여 쿼리 문자열 매핑

FastAPI: How to use Pydantic to declare Query Parameters

이제 쿼리 문자열을 얻으려면 함수를 만든 다음 이를 종속성으로 추가할 필요가 없습니다. FastAPI에 PaginationQueryString 유형의 객체를 원하며 이것이 쿼리 문자열임을 간단히 알릴 수 있습니다.

from typing import Annotated
from fastapi import FastAPI, Query
from pydantic import BaseModel

app = FastAPI()

class PaginationQueryString(BaseModel):
    limit: int | None = 10
    skip: int | None = 1
    filter: str | None = None

@app.get("/")
async def search(q: Annotated[PaginationQueryString, Query()]):
    return q
로그인 후 복사

쉽죠? ?

⚠️ 제한사항은 무엇인가요?

적어도 0.115.0 버전에서는 중첩된 모델에서는 잘 작동하지 않습니다.

다음과 같이 시도해 보세요.

from typing import Annotated
from fastapi import FastAPI, Query
from pydantic import BaseModel

app = FastAPI()

class Filter(BaseModel):
    name: str | None = None
    age: int | None = None
    nickname: str | None = None

class PaginationQueryString(BaseModel):
    limit: int | None = 10
    skip: int | None = 1
    filter: Filter | None = None

@app.get("/")
async def search(q: Annotated[PaginationQueryString, Query()]):
    return q
로그인 후 복사

이전처럼 부르면:

GET http://localhost:8000/?limit=42&skip=12&filter=chocolate
로그인 후 복사

필터가 객체라는 오류가 발생합니다.

{
    "detail": [
        {
            "type": "model_attributes_type",
            "loc": [
                "query",
                "filter"
            ],
            "msg": "Input should be a valid dictionary or object to extract fields from",
            "input": "chocolate"
        }
    ]
}
로그인 후 복사

적어도 지금 당장은 절대적으로 맞습니다! 우리는 필터를 문자열이 아닌 Pydantic 모델로 변경했습니다. 하지만 이를 사전으로 변환하려고 하면:

http://localhost:8000/?limit=42&skip=12&filter={%22name%22:%20%22Rafael%22,%20%22age%22:%2038,%20%22nickname%22:%20%22ceb10n%22}
로그인 후 복사

FastAPI는 필터가 유효한 사전이어야 한다고 알려줍니다.

{
    "detail": [
        {
            "type": "model_attributes_type",
            "loc": [
                "query",
                "filter"
            ],
            "msg": "Input should be a valid dictionary or object to extract fields from",
            "input": "{\"name\": \"Rafael\", \"age\": 38, \"nickname\": \"ceb10n\"}"
        }
    ]
}
로그인 후 복사

FastAPI가 dict가 아닌 FastAPI에 문자열을 제공하는 Starlette의 QueryParams에 의존하기 때문에 이런 일이 발생합니다. 그리고 적어도 0.115.0 버전에서는 오류가 발생합니다.

⁉️ 그렇다면 언제 쿼리 매개변수와 함께 Pydantic 모델을 사용합니까?

매우 간단합니다.

✅ 정교하고 멋진 중첩 개체가 필요하지 않은 간단한 쿼리 문자열이 있나요? 그것을 사용하십시오! ?

❌ 복잡한 중첩 쿼리 문자열을 생성하셨나요? 아직 사용하지 않으셨나요?. (그리고 쿼리 문자열을 다시 생각해 봐야 할 수도 있습니다. ? 간단할수록 좋습니다 ?)

위 내용은 FastAPI: Pydantic을 사용하여 쿼리 매개변수를 선언하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿