Для начала работы импортируем основной класс 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, включая обычные адреса, адреса с динамическими параметрами и параметрами запроса. Рассмотрена обработка ошибок и указание типов данных для повышения надёжности и читаемости кода.