К основному содержанию
правило

tornado — правило для Cursor: async/await в Tornado

Правило для Cursor задаёт стиль кода в Tornado: только async/await для ввода-вывода, полные аннотации типов и один обработчик ошибок на всё приложение.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/tornado.mdc
Открыть на GitHub

Что делает 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

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Из того же набора69

vitest Правило задаёт Cursor, как писать юнит- и интеграционные тесты на Vitest: где держать файлы, как изолировать кейсы и мокать модули. ★ 3 579звёзд репо vercel Правило для Cursor с набором рекомендаций по разработке и деплою приложений на Vercel. Пригодится, если агент пишет код для Next.js и вы хотите, чтобы он сразу держал в голове конвенции платформы. ★ 3 579звёзд репо unittest Правило задаёт агенту стандарт оформления тестов на unittest: структура каталогов, имена классов и методов, ассерты, моки. ★ 3 579звёзд репо transformers Правило для Cursor задаёт стиль работы с библиотекой 🤗 Transformers: модульные модели, типизация, Trainer вместо ручных циклов обучения. ★ 3 579звёзд репо three-js Правило для Cursor задаёт стандарты разработки на three.js: обработка ошибок WebGL, ленивая загрузка ассетов, оптимизация цикла рендера и освобождение ресурсов. ★ 3 579звёзд репо svelte Правило для Cursor задаёт, как писать компоненты Svelte 5: руны вместо старой реактивности, типизация и ключи в списках. Пригодится, если проект уже на Svelte 5. ★ 3 579звёзд репо streamlit Правило для Cursor задаёт, как писать приложения на Streamlit: кэшировать тяжёлые операции, держать UI отдельно от логики и разбивать проект на модули. ★ 3 579звёзд репо sqlalchemy Правило для Cursor задаёт стиль SQLAlchemy 2.x: типизированные модели, сессии через контекстный менеджер, select() вместо устаревшего Query. ★ 3 579звёзд репо

Похожие

fastapi-python Mindrally Задаёт агенту стиль разработки на FastAPI: async, Pydantic v2, обработка ошибок и структура роутеров. Пригодится, когда пишете API на Python. CX Codex +1 13 900установок python-pro https://github.com/Jeffallan Скилл для написания типобезопасного Python 3.11+ с полной аннотацией, async-кодом и тестами. Генерирует код с type hints, настраивает mypy в строгом режиме, пишет pytest-тесты с фиксчурами и мокингом. CX Codex +1 8 800установок neo4j-driver-python-skill neo4j-contrib Подсказывает агенту, как правильно писать Python-код под драйвер Neo4j v6: жизненный цикл драйвера, транзакции, async, батчинг через UNWIND. CX Codex +1 976установок fastapi-async-patterns TheBushidoCollective Скилл с готовыми шаблонами async-роутов, асинхронных баз данных, фоновых задач и WebSocket в FastAPI. Пригодится, когда API начинает тормозить на конкурентных запросах. CX Codex +1 953установок fastapi-development aj-geddes Скилл для ИИ-агента, который помогает писать Python-API на FastAPI: асинхронные роуты, валидация через Pydantic, JWT и автодокументация OpenAPI. CX Codex +1 618установок asyncio-concurrency-patterns manutej Скилл по конкурентности в Python: event loop, корутины, задачи, семафоры и блокировки. Пригодится, когда пишешь асинхронный сервис или клиент. CX Codex +1 489установок

Рядом в теме «Бэкенд и 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

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой