tornado — правило для Cursor: async/await в Tornado
Правило для Cursor задаёт стиль кода в Tornado: только async/await для ввода-вывода, полные аннотации типов и один обработчик ошибок на всё приложение.
.cursor/rules/tornado.mdcЧто делает tornado
Файл .cursor/rules/tornado.mdc подключается к Cursor и действует на все **/*.py. Внутри — набор правил для Tornado на Python 3.9+ и примеры «плохо/хорошо» с кодом. Агент видит их при правках и подсказывает в том же стиле.
Главное требование — никакого блокирующего ввода-вывода в обработчиках. time.sleep останавливает IOLoop, поэтому вместо него await asyncio.sleep. То же касается старых callback-API: Tornado работает поверх asyncio, и правило требует async def с await для любой операции с сетью или диском. Второе — аннотации типов через from __future__ import annotations, включая типизацию аргументов запроса.
Ошибки разбираются централизованно. Кривые заголовки и битый multipart-form-data Tornado отлавливает сам, и правило прямо запрещает ловить такие исключения в каждом обработчике. Вместо этого предлагается базовый класс с общим ответом на HTTPError. Если в проекте уже есть свой слой обработки ошибок, правило придётся править под него — иначе агент будет тянуть код к предложенной схеме.
Какие задачи решает
- убрать блокирующие вызовы из обработчиков Tornado
- перевести старый код с callback-API на async/await
- проставить аннотации типов в хендлерах и аргументах запроса
- свести ответы на ошибки к одному базовому классу
- не ловить вручную исключения по битым заголовкам и multipart-данным
Примеры запросов агенту
- проверь мой хендлер на блокирующий ввод-вывод и перепиши на async/await
- добавь аннотации типов в этот RequestHandler по правилам tornado
- сделай BaseHandler с общим ответом на HTTPError вместо try/except в каждом методе
Как установить tornado
Вручную: положить файлы
.cursor/rules/tornado.mdcВо frontmatter: description, globs, alwaysApply
Вручную: положить файлы
.claude/rules/tornado.mdПоле paths во frontmatter ограничивает файлы: globs из источника → paths
AGENTS.md
Codex читает AGENTS.md: вставьте текст правила туда
Вручную: положить файлы
.github/instructions/tornado.instructions.mdПоле applyTo задаёт, к каким файлам применять: globs из источника → applyTo
Вручную: положить файлы
.devin/rules/tornado.mdВручную: положить файлы
.clinerules/tornado.mdПо шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules
Из того же набора69
Похожие
Рядом в теме «Бэкенд и API»
Всё по теме «Бэкенд и API» →Вопросы о tornado
Как установить правило tornado в Cursor?
Создайте файл .cursor/rules/tornado.mdc в корне проекта и вставьте в него содержимое правила.
Что делает правило tornado?
Задаёт Cursor стиль кода для приложений на Tornado: async/await вместо блокирующих вызовов, полные аннотации типов и централизованная обработка ошибок.
На какие файлы действует правило?
В нём прописан glob **/*.py, то есть все Python-файлы проекта.
Исходный текст
tornado.mdc · CC0-1.0
---
description: Definitive guidelines for writing high-performance, secure, and maintainable Tornado applications using modern Python 3.9+ async/await patterns and best practices.
globs: **/*.py
---
# tornado Best Practices
Tornado is a powerful, non-blocking web framework ideal for high-concurrency applications, WebSockets, and long-polling. These rules enforce modern (Python 3.9+, 2025 standards) best practices, ensuring your code is performant, secure, and maintainable.
## 1. Embrace `async/await` for All I/O
Always use `async def` and `await` for any I/O-bound operations. Avoid older callback-based APIs. Tornado integrates seamlessly with `asyncio`.
❌ BAD: Blocking I/O in a handler
```python
import time
import tornado.web
class BadHandler(tornado.web.RequestHandler):
def get(self) -> None:
time.sleep(1) # Blocks the IOLoop
self.write("Hello, blocked world!")
```
✅ GOOD: Asynchronous I/O
```python
import asyncio
import tornado.web
class GoodHandler(tornado.web.RequestHandler):
async def get(self) -> None:
await asyncio.sleep(1) # Non-blocking
self.write("Hello, async world!")
```
## 2. Leverage Type Hints
Utilize full type annotations (`from __future__ import annotations`) for clarity, static analysis, and improved IDE support. Tornado's stubs are well-maintained.
❌ BAD: Untyped handler
```python
class UntypedHandler(tornado.web.RequestHandler):
def post(self):
name = self.get_argument("name")
self.write(f"Hello, {name}")
```
✅ GOOD: Fully typed handler
```python
from __future__ import annotations
import tornado.web
class TypedHandler(tornado.web.RequestHandler):
async def post(self) -> None:
name: str = self.get_argument("name")
self.write(f"Hello, {name}")
```
## 3. Centralized Error Handling
Let Tornado's built-in error handling for malformed requests (e.g., `multipart-form-data`, invalid headers) propagate. Implement a custom `ErrorHandler` for consistent responses.
❌ BAD: Ignoring or manually handling low-level header errors
```python
# This is an anti-pattern; Tornado handles these automatically.
# Do not try to catch exceptions for malformed headers or multipart data
# directly in every handler. Let it propagate.
```
✅ GOOD: Custom `HTTPError` handler
```python
from __future__ import annotations
import tornado.web
import json
class BaseHandler(tornado.web.RequestHandler):
© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc