백엔드 개발 파이썬 튜토리얼 FastAPI: Pydantic을 사용하여 쿼리 매개변수를 선언하는 방법

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

Oct 10, 2024 am 06:11 AM

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? Mar 10, 2025 pm 06:54 PM

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까?

파이썬의 이미지 필터링 파이썬의 이미지 필터링 Mar 03, 2025 am 09:44 AM

파이썬의 이미지 필터링

파이썬에서 파일을 다운로드하는 방법 파이썬에서 파일을 다운로드하는 방법 Mar 01, 2025 am 10:03 AM

파이썬에서 파일을 다운로드하는 방법

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Mar 05, 2025 am 09:58 AM

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법

Python을 사용하여 PDF 문서를 사용하는 방법 Python을 사용하여 PDF 문서를 사용하는 방법 Mar 02, 2025 am 09:54 AM

Python을 사용하여 PDF 문서를 사용하는 방법

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Mar 02, 2025 am 10:10 AM

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Mar 10, 2025 pm 06:52 PM

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까?

NLTK (Natural Language Toolkit) 소개 NLTK (Natural Language Toolkit) 소개 Mar 01, 2025 am 10:05 AM

NLTK (Natural Language Toolkit) 소개

See all articles