FastAPI: Обработка URL и параметров (Урок 2)

Для начала работы импортируем основной класс FastAPI:

from fastapi import FastAPI

app = FastAPI()

Созданный объект app используется для описания обработки различных URL-адресов.

Обработка главной страницы

Декоратор @app.get("/") обрабатывает URL /:

@app.get("/")
async def home():
    return {"date": "mess"}

Функция home возвращает словарь. Запуск проекта:

uvicorn main:app --reload

Опция —reload перезапускает сервер при изменении файла (в реальных проектах не рекомендуется). Переход по URL отобразит возвращаемый словарь. Возможен возврат других типов данных: строк, списков и т.д. Например:

@app.get("/")
async def home():
    return ["a", "b"]

Документация и указание типов данных

FastAPI автоматически генерирует документацию по адресу /docs, содержащую описание обработанных URL-адресов, возвращаемые типы данных, коды ответов (например, 200 OK) и параметры. Возможность тестирования запросов упрощает проверку приложения.

Для повышения надёжности и читаемости кода укажем типы данных:

@app.get("/")
async def home() -> list[str]:
    return ["a", "b"]

list[str] указывает на возврат списка строк. Несоответствие типов вызовет ошибку Internal Server Error. Аналогично для словаря:

@app.get("/")
async def home() -> dict[str, str]:
    return {"key": "value"}

Обработка дополнительных страниц и асинхронные функции

Обработка других страниц аналогична. Например, для страницы контактов:

@app.get("/contacts")
async def contacts():
    return 34

Функция contacts возвращает целое число. В документации появится URL /contacts.

Для повышения эффективности функции можно сделать асинхронными, добавив async:

@app.get("/")
async def home() -> list[str]:
    return ["a", "b"]

Работа со списками данных и динамическими параметрами

Создадим список статей:

posts = [
    {"id": 1, "title": "One", "body": "Текст один"},
    {"id": 2, "title": "News 2", "body": "Текст два"},
    {"id": 3, "title": "News 3", "body": "Текст три"},
]

URL-адрес /items возвращает весь список:

@app.get("/items")
async def items() -> list[dict]:
    return posts

Для динамических параметров в URL используем фигурные скобки:

@app.get("/items/{id}")
async def read_item(id: int):
    for post in posts:
        if post["id"] == id:
            return post
    raise HTTPException(status_code=404, detail="Post not found")

read_item принимает параметр id типа int и возвращает статью или ошибку 404.

Работа с параметрами запроса

Параметры запроса передаются после ?. Например, /search?post_id=2.

from typing import Optional
from fastapi import HTTPException

@app.get("/search")
async def search(post_id: Optional[int] = None):
    if post_id:
        for post in posts:
            if post["id"] == post_id:
                return post
        raise HTTPException(status_code=404, detail="Post not found")
    else:
        return {"date": "No Post ID provided"}

search принимает опциональный параметр post_id. При его наличии происходит поиск; иначе возвращается сообщение.

В этом уроке рассмотрена обработка различных URL-адресов в FastAPI, включая обычные адреса, адреса с динамическими параметрами и параметрами запроса. Рассмотрена обработка ошибок и указание типов данных для повышения надёжности и читаемости кода.

Что будем искать? Например,программа