EMZETT.
Войти

FastAPI и Flask: создание веб-API на Python

Коротко: Flask — компактный фреймворк веб-сервера, FastAPI использует аннотации типов для автоматической валидации и документации; оба отдают API JSON несколькими строками кода.

Подробнее: Программы на Python можно предоставлять как веб-API: браузер/приложение отправляет HTTP-запросы, сервер отвечает JSON. Flask (2010) и FastAPI (2018) — два популярных фреймворка; Django — вариант «всё включено».

Подробности

Flask в 10 строках

from flask import Flask, jsonify, request
app = Flask(__name__)
games = [{"id": 1, "title": "Zelda"}]
@app.get("/games")
def list_games():
    return jsonify(games)
@app.post("/games")
def create():
    data = request.get_json()
    games.append({"id": len(games) + 1, **data})
    return jsonify(games[-1]), 201

Запуск: flask --app app run --debug. Режим отладки никогда не в интернете/продакшне (возможно выполнение кода). Продакшн: Gunicorn/uWSGI за Nginx. Валидацию и документацию добавляйте сами (или расширения: Marshmallow, Flask-RESTX).

FastAPI

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
app = FastAPI()
class GameIn(BaseModel):
    title: str = Field(min_length=1, max_length=80)
    price: float = Field(gt=0)
@app.post("/games", status_code=201)
async def create(game: GameIn):
    return {"id": 1, **game.model_dump()}
@app.get("/games/{game_id}")
async def read(game_id: int):
    if game_id != 1:
        raise HTTPException(404, "not found")
    return {"id": 1, "title": "Zelda"}

Запуск: uvicorn main:app --reload. Аннотации типов + pydantic автоматически проверяют ввод (ошибочный → 422 со списком ошибок); /docs (Swagger UI) и /redoc генерируются автоматически из OpenAPI. Возможен async (ASGI), внедрение зависимостей (Depends), аутентификация (помощники OAuth2/JWT).

Сравнение

  • Flask: минимален, гибок, огромная экосистема, синхронный (async ограничен); хорош для обучения/небольших сервисов/страниц, отрисовываемых на сервере (Jinja).
  • FastAPI: современный, на типах, автоматические валидация + документация, высокая производительность, идеален для API JSON/ML-сервисов.
  • Django: ORM, админка, аутентификация, формы встроены; для крупных веб-приложений.
  • Альтернативы: Litestar, Starlette, aiohttp, Express (JS), Spring Boot (Java).
  • Развёртывание: Docker, uvicorn/gunicorn, обратный прокси, HTTPS, переменные окружения для секретов.

Безопасность и практика

  • Никогда не доверяйте вводу: проверяйте; избегайте SQL-инъекций (параметризованные запросы/ORM).
  • CORS настраивайте осознанно, ограничение частоты запросов, аутентификация/авторизация, HTTPS, страницы ошибок без внутренних подробностей.
  • Секреты не в коде; журналирование без паролей.
  • Тесты: TestClient (FastAPI) / app.test_client() (Flask) с pytest.
  • Структура проекта: роутеры/blueprint, слои (API → сервис → база данных), конфигурация.
  • Модель ML как API (FastAPI + ONNX/scikit-learn) — классический пример.
  • Экзамен/проект: применяйте принципы REST (ресурсы, методы, коды состояния).

См. также: Проектирование REST API, Django, Аннотации типов, OpenAPI и Swagger