Запросы и ответы FastAPI

В FastAPI запрос и ответ — основа взаимодействия с клиентами.

FastAPI предоставляет мощные инструменты для разбора данных запроса и создания стандартизированных ответов по мере необходимости.

Далее подробно рассмотрим запросы и ответы в FastAPI.

По вопросам, связанным с HTTP, см.:Методы HTTP-запросов。

Данные запроса

Параметр запроса

В следующем примере мы определяем/items/маршрут, который принимает два параметра запроса:skipиlimit, их типы — целые числа, а значения по умолчанию соответственно0и10。

Пример

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

Выполните следующую команду в командной строке, чтобы запустить приложение:

uvicorn main:app --reload

Теперь откройте браузер и перейдите по адресуhttp://127.0.0.1:8000/items/, который возвращает стандартные JSON-данные:

Передайте параметрыGET-запросаhttp://127.0.0.1:8000/items/?skip=1&limit=5, возвращает JSON-данные следующим образом:

Параметр пути

Мы можем задавать параметры в пути, делая URL более эстетически привлекательным.

В следующем примере мы определяем параметр путиitem_idи параметры запросаqмаршрута.

Пример

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

Передайте параметрыGET-запросаhttp://127.0.0.1:8000/items/5/?q=example, возвращает JSON-данные следующим образом:

тело запроса

Далее мы создали/items/маршрут, используя@app.postДекоратор указывает, что это обрабатываетPOSTмаршрут запроса.

Пример

from pydantic import BaseModel
from fastapi import FastAPI

app = FastAPI()
class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

@app.post("/items/")
def create_item(item: Item):
    return item

Используйте модель Pydantic Item для определения тела запроса, содержащего несколько полей, некоторые из которых имеют значения по умолчанию. Для более подробного знакомства с Pydantic см.:Модель Pydantic в FastAPI。

Далее мы можем открытьhttp://127.0.0.1:8000/docsчтобы выполнить тест POST:

Заполните параметры запроса:

Возвращаемый результат выглядит следующим образом:


Данные ответа

Возврат данных JSON

Функция-обработчик маршрута возвращает словарь, который FastAPI автоматически преобразует в формат JSON и отправляет клиенту в качестве ответа:

Пример

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

Когда приведённый выше код открывается в браузереhttp://127.0.0.1:8000/items/, возвращаются данные JSON:

Возврат модели Pydantic

Функция-обработчик маршрута возвращает экземпляр модели Pydantic. FastAPI автоматически преобразует его в формат JSON и отправляет клиенту в качестве ответа:

Пример

from pydantic import BaseModel
from fastapi import FastAPI

app = FastAPI()
class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

@app.post("/items/")
def create_item(item: Item):
    return item

POST-запрос, возвращаемый формат данных выглядит следующим образом:

{
  "name": "example",
  "description": "Example POST 测试",
  "price": 12,
  "tax": 1
}

Заголовки запроса и Cookies

Используйте аннотации типов Header и Cookie для получения данных заголовков запроса и cookie.

Пример

from fastapi import Header, Cookie
from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
def read_item(user_agent: str = Header(None), session_token: str = Cookie(None)):
    return {"User-Agent": user_agent, "Session-Token": session_token}

Когда приведённый выше код открывается в браузереhttp://127.0.0.1:8000/items/, возвращаются данные JSON:


Перенаправления и коды состояния

ИспользованиеRedirectResponseРеализуйте перенаправление, перенаправляющее клиента на/items/маршрут.

Пример

from fastapi import Header, Cookie
from fastapi import FastAPI
from fastapi.responses import RedirectResponse

app = FastAPI()

@app.get("/items/")
def read_item(user_agent: str = Header(None), session_token: str = Cookie(None)):
    return {"User-Agent": user_agent, "Session-Token": session_token}

@app.get("/redirect")
def redirect():
    return RedirectResponse(url="/items/")

При обращении к приведённому выше коду в браузереhttp://127.0.0.1:8000/redirect/произойдёт автоматическое перенаправление наhttp://127.0.0.1:8000/items/страницу:

Используйте HTTPException для возбуждения исключений и возврата пользовательских кодов состояния и подробной информации.

В следующих примерахitem_idравен42вернёт404Код состояния:

Пример

from fastapi import HTTPException

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id == 42:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item_id": item_id}

Когда приведённый выше код открывается в браузереhttp://127.0.0.1:8000/items/42/Страница отображается следующим образом:


Пользовательские заголовки ответа

ИспользованиеJSONResponseПользовательские заголовки ответа:

Пример

from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int):
    content = {"item_id": item_id}
    headers = {"X-Custom-Header": "custom-header-value"}
    return JSONResponse(content=content, headers=headers)

Когда приведённый выше код открывается в браузереhttp://127.0.0.1:8000/items/42/Страница отображается следующим образом, где мы можем увидеть наши пользовательские заголовки ответа:

Другие расширения