#62.TIL | FastAPI 공식문서 따라하기(5)

Seongjae Hwang·2023년 1월 15일
0

https://slender-danger-059.notion.site/6-Query-Parameters-and-String-Validations-0a4928924fa6419c8eb970a13ded3c01

Query Parameters and String Validations

FastAPI에서 파라미터에 대한 추가적인 검증을 지원한다.

기존에 사용하던 파라미터 검증

from typing import Union

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
async def read_items(q: Union[str, None] = None):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

추가적인 validation

Import Query

from typing import Union

**from fastapi import FastAPI, Query**

app = FastAPI()

@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=None, max_length=50)):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

Use Query as the default value

  • Query를 default값 넣는 곳에 넣고, 다양한 validation 옵션 등을 줄 수 있다.

  • max_length

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/items/")
**async def read_items(q: Union[str, None] = Query(default=None, max_length=50)):**
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • min_length
from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/items/")
async def read_items(
    **q: Union[str, None] = Query(default=None, min_length=3, max_length=50)**
):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • regular expression (정규표현식)
    • ^: starts with the following characters, doesn't have characters before.
    • fixedquery: has the exact value fixedquery.
    • $: ends there, doesn't have any more characters after fixedquery.
from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/items/")
async def read_items(
    q: Union[str, None] = Query(
        **default=None, min_length=3, max_length=50, regex="^fixedquery$"**
    )
):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • default values
from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/items/")
**async def read_items(q: str = Query(default="fixedquery", min_length=3)):**
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
  • required
    • 1) default value를 선언하지 않기
      from fastapi import FastAPI, Query
      
      app = FastAPI()
      
      @app.get("/items/")
      **async def read_items(q: str = Query(min_length=3)):**
          results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
          if q:
              results.update({"q": q})
          return results
    • 2) Ellipsis (…)
      from fastapi import FastAPI, Query
      
      app = FastAPI()
      
      @app.get("/items/")
      **async def read_items(q: str = Query(default=..., min_length=3)):**
          results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
          if q:
              results.update({"q": q})
          return results
    • 3) default를 required 선언
      from fastapi import FastAPI, Query
      **from pydantic import Required**
      
      app = FastAPI()
      
      @app.get("/items/")
      **async def read_items(q: str = Query(default=Required, min_length=3)):**
          results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
          if q:
              results.update({"q": q})
          return results

추가) 더 많은 meta data 추가하기

from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/items/")
async def read_items(
    q: Union[str, None] = Query(
        default=None,
        **title="Query string",**
        **description="Query string for the items to search in the database that have a good match",**
        min_length=3,
    )
):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results
profile
Always Awake

0개의 댓글