Введение в Tornado
Tornado — это асинхронный веб-сервер и веб-фреймворк на Python, разработанный для обслуживания большого количества одновременных соединений. Он сочетает высокую производительность с гибкой архитектурой и применяется в создании веб-приложений, API-сервисов и систем реального времени с поддержкой WebSocket. Благодаря использованию неблокирующего ввода-вывода и встроенного цикла событий, Tornado особенно хорошо подходит для обработки большого количества клиентов и чатов, стриминга и push-уведомлений.
Особенности и преимущества Tornado
-
Асинхронная архитектура на основе событий
-
Поддержка WebSocket и долгих соединений (long polling)
-
Встроенный HTTP-сервер
-
Обработка тысяч соединений на одном потоке
-
Гибкое маршрутизирование и middleware
-
Совместимость с asyncio (начиная с версии 5.0+)
-
Низкий уровень абстракции — полный контроль над логикой
Установка и структура проекта
Установка Tornado:
Минимальная структура проекта:
Запуск простого веб-сервера
Пример базового приложения:
Обработка маршрутов и запросов
Добавление URL-маршрутов:
Передача параметров в get(self, id)
возможна через регулярные выражения.
Асинхронные обработчики и цикл событий
Асинхронный обработчик:
Tornado совместим с async def
и использует IOLoop
как ядро событийной модели.
Работа с шаблонами HTML
Tornado использует собственный шаблонизатор:
В обработчике:
Обработка форм и данных POST
Форма:
Обработчик:
Работа с файлами и загрузка данных
Загрузка файла:
WebSocket в Tornado
Подключение:
Работа с базой данных (Motor, AsyncPG)
Пример с MongoDB (Motor):
Асинхронный запрос:
Middleware и фильтрация запросов
Через методы prepare()
и set_default_headers()
можно настроить промежуточную обработку:
Обработка ошибок и логирование
Настройка write_error()
:
Логирование:
Безопасность и защита от атак
-
Защита от XSRF:
self.check_xsrf_cookie()
-
HTTPS: через
ssl_options
вapp.listen
-
CORS: ручная настройка заголовков
-
Ограничение методов и проверка Content-Type
Развёртывание Tornado-сервера в продакшн
Запуск на определённом IP и порту:
С использованием gunicorn
с WSGI-адаптером или через систему supervisor
, systemd
.
Примеры практического применения Tornado
-
Реализация WebSocket-чатов
-
Push-сервисы и уведомления
-
Панели мониторинга в реальном времени
-
Асинхронные API и микросервисы
-
Веб-интерфейсы для потоковых данных
Часто задаваемые вопросы
Что такое Tornado?
Асинхронный веб-сервер и фреймворк на Python для масштабируемой обработки HTTP-запросов и WebSocket-соединений.
Поддерживает ли Tornado asyncio?
Да, начиная с версии 5.0, Tornado полностью совместим с asyncio.
Чем Tornado отличается от FastAPI или Flask?
Tornado — это низкоуровневый фреймворк с приоритетом на асинхронность и масштабируемость, в отличие от более высокоуровневых FastAPI и Flask.
Есть ли поддержка шаблонов?
Да, Tornado имеет встроенный шаблонизатор.
Подходит ли Tornado для продакшн?
Да, при правильной настройке Tornado способен обслуживать тысячи соединений и применяется в крупных проектах.
Полный справочник по ключевым функциям и структуре фреймворка Tornado
для Python
Установка
Основные особенности Tornado
-
Асинхронная модель на базе
asyncio
. -
Высокая производительность и масштабируемость.
-
Поддержка WebSocket "из коробки".
-
Встроенный HTTP-сервер (не требует WSGI).
-
Поддержка маршрутизации, шаблонов и куки.
Основные модули и классы
Компонент | Назначение |
---|---|
tornado.web.Application |
Приложение со списком URL-обработчиков. |
tornado.web.RequestHandler |
Базовый класс для создания контроллеров. |
tornado.ioloop.IOLoop |
Главный цикл событий. |
tornado.httpserver.HTTPServer |
Обёртка для запуска Tornado-сервера. |
tornado.websocket.WebSocketHandler |
Обработчик WebSocket-соединений. |
Пример простого HTTP-приложения
Асинхронные обработчики
Передача данных (GET, POST)
Маршруты
Маршруты — список кортежей: (r"/путь", КлассОбработчика)
Поддержка регулярных выражений и параметров:
Шаблоны (HTML)
По умолчанию используется собственный шаблонизатор.
Пример файла index.html
в templates/
:
В RequestHandler
:
Для этого в Application
указываем:
Работа со статикой
Доступ к файлам: http://localhost:8888/static/style.css
Куки и сессии
Метод | Описание |
---|---|
self.set_cookie("key", "value") |
Установка куки. |
self.get_cookie("key") |
Получение куки. |
self.clear_cookie("key") |
Удаление куки. |
Обработка ошибок
WebSocket
Запуск HTTP/HTTPS сервера
Для HTTPS:
Интеграция с asyncio
Примеры продвинутого использования
-
Асинхронные HTTP-запросы через
tornado.httpclient.AsyncHTTPClient
. -
Обработка форм и загрузка файлов:
self.request.files
.