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