Sanic – быстрый асинхронный веб-фреймворк

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение в Sanic

Sanic — это асинхронный веб-фреймворк на Python, созданный для обработки HTTP-запросов с высокой скоростью. Он построен на asyncio и позволяет писать async def обработчики, обеспечивая параллельную обработку тысяч соединений. Sanic применяется для создания REST API, микросервисов, real-time-приложений и бэкендов с интенсивной нагрузкой.


Ключевые особенности Sanic

  • Поддержка async/await из коробки

  • Высокая производительность, сравнимая с Node.js и Go

  • Маршруты, middleware, WebSocket, шаблоны

  • Поддержка CORS, cookie, сессий

  • Простая структура проекта

  • Подходит для масштабируемых API


Установка и начальная настройка

Установка:

bash
pip install sanic

Дополнительно:

bash
pip install jinja2 aiofiles python-dotenv

Создание первого приложения Sanic

python
from sanic import Sanic from sanic.response import text app = Sanic("MyApp") @app.get("/") async def index(request): return text("Привет от Sanic") if __name__ == "__main__": app.run(host="0.0.0.0", port=8000)

Асинхронные маршруты и обработка HTTP-запросов

python
@app.get("/async") async def async_route(request): await asyncio.sleep(1) return text("Асинхронный ответ")

Работа с параметрами маршрута и query-строкой

Маршрут с параметром:

python
@app.get("/user/<user_id:int>") async def get_user(request, user_id): return text(f"ID пользователя: {user_id}")

Query-параметры:

python
@app.get("/search") async def search(request): query = request.args.get("q", "ничего") return text(f"Поиск: {query}")

Обработка данных POST и JSON

python
from sanic.response import json @app.post("/api/data") async def receive_data(request): data = request.json return json({"received": data})

Form-данные:

python
data = request.form.get("username")

Ответы: текст, JSON, HTML, redirect

python
from sanic.response import text, json, html, redirect @app.get("/html") async def html_page(request): return html("<h1>Страница</h1>") @app.get("/go") async def go(request): return redirect("/new")

Обработка ошибок и кастомные исключения

python
from sanic.exceptions import NotFound, SanicException @app.exception(NotFound) async def not_found(request, exception): return json({"error": "Страница не найдена"}, status=404)

Кастомное исключение:

python
class Unauthorized(SanicException): status_code = 401

Middleware и lifecycle-хуки

Middleware:

python
@app.middleware("request") async def before_request(request): request.ctx.start = "Запуск" @app.middleware("response") async def after_response(request, response): response.headers["X-Framework"] = "Sanic"

Работа с cookie, сессиями и заголовками

python
@app.get("/set") async def set_cookie(request): response = text("Куки установлены") response.cookies["session"] = "123456" return response @app.get("/get") async def get_cookie(request): return text(request.cookies.get("session", "не установлены"))

Обработка файлов и загрузка

python
@app.post("/upload") async def upload(request): file = request.files.get("file") with open(f"./uploads/{file.name}", "wb") as f: f.write(file.body) return text("Файл загружен")

Работа с шаблонами (Jinja2)

python
from sanic_ext import Extend from sanic_ext.extensions.template import render Extend(app) @app.get("/template") @render("index.html") async def show_template(request): return {"name": "Sanic"}

Шаблон templates/index.html:

html
<h1>Привет, {{ name }}</h1>

Встроенная поддержка WebSocket

python
@app.websocket("/ws") async def feed(request, ws): while True: message = await ws.recv() await ws.send(f"Ответ: {message}")

Интеграция с базами данных и ORM

Можно использовать encode/databases, gino, sqlalchemy, ormar:

python
import databases database = databases.Database("sqlite:///db.sqlite") @app.before_server_start async def connect(app, _): await database.connect() @app.after_server_stop async def disconnect(app, _): await database.disconnect()

Организация структуры проекта

arduino
project/ ├── app.py ├── templates/ ├── static/ ├── routes/ ├── models/ └── config.py

Можно использовать blueprint для разделения модулей:

python
from sanic import Blueprint bp = Blueprint("users", url_prefix="/users") @bp.get("/") async def get_users(request): return json(["user1", "user2"]) app.blueprint(bp)

Тестирование Sanic-приложений

python
import pytest from app import app @pytest.mark.asyncio async def test_index(): request, response = await app.asgi_client.get("/") assert response.status == 200 assert response.text == "Привет от Sanic"

Развёртывание и продакшн-настройки

Команда:

bash
sanic app.app --host=0.0.0.0 --port=8000 --workers=4

Производственные настройки:

  • Включение access_log=False

  • workers=4 для многопоточности

  • Использование Nginx как reverse-proxy


Примеры практического применения

  • Асинхронные REST API

  • WebSocket-серверы и чаты

  • IoT-платформы

  • Микросервисы

  • Backend для SPA и мобильных приложений


Часто задаваемые вопросы

Что такое Sanic?

Это асинхронный веб-фреймворк на Python, ориентированный на скорость и производительность.

Чем Sanic отличается от Flask?

Sanic полностью поддерживает async/await, имеет встроенный WebSocket и высокую производительность.

Поддерживает ли Sanic шаблоны?

Да, через расширения и интеграцию с Jinja2.

Подходит ли Sanic для продакшн?

Да, с использованием нескольких воркеров и внешнего сервера.

Какой сервер использовать?

Встроенный сервер Sanic подходит как для dev, так и для prod. Также можно использовать uvicorn с ASGI.

Полный справочник по ключевым функциям и модулям библиотеки Sanic для Python

Основы: запуск приложения и маршруты

Компонент Описание
Sanic("app_name") Создает экземпляр приложения.
@app.get("/path"), @app.post("/path") Декораторы для маршрутов.
await response.json(...) / text(...) Возврат JSON или текстового ответа.
app.run(host, port, debug=True) Запуск приложения.
python
from sanic import Sanic from sanic.response import json app = Sanic("MyApp") @app.get("/") async def hello(request): return json({"message": "Привет, Sanic!"}) app.run()

Объект запроса (request)

Свойство / Метод Описание
request.args Query-параметры (dict[str, list[str]]).
request.json Данные JSON-запроса (dict).
request.form Данные формы (POST).
request.files Файлы из формы.
request.headers Заголовки запроса.
request.cookies Куки.
request.path / request.method Путь и метод HTTP.

Объект ответа (response)

Функция / Метод Описание
text("...") Текстовый ответ.
json({...}) JSON-ответ.
html("<html>...</html>") HTML-ответ.
file("path") Отправка файла.
redirect("url") Редирект на другой адрес.
python
from sanic.response import text, json, redirect

Параметры в URL

Синтаксис Описание
/user/<name> Параметр пути.
request.path_params['name'] Получение значения параметра.
python
@app.get("/hello/<name>") async def greet(request, name): return text(f"Привет, {name}")

Middleware

Тип Описание
@app.middleware("request") Выполняется до запроса.
@app.middleware("response") Выполняется после запроса.
python
@app.middleware("request") async def add_header(request): request.ctx.start_time = request.time

Обработка ошибок

Метод Описание
@app.exception(ExceptionType) Обработка указанного исключения.
raise SanicException(...) Встроенные HTTP-исключения.
abort(status_code) Немедленное завершение запроса.
python
from sanic.exceptions import NotFound @app.exception(NotFound) async def handle_404(request, exception): return text("Не найдено", status=404)

Фоновая обработка (Background Tasks)

Компонент Описание
@app.after_server_start Выполняется при запуске сервера.
@app.before_server_stop Выполняется перед остановкой.
app.ext.add_task(coroutine) Добавление фоновой задачи.

Куки и заголовки