Перейти к содержанию

Философия

Несколько решений объясняют в EndoCore всё остальное.

Дерево папок — это API

Роутинг, версионирование и CLI — один механизм, а не три. Все они работают с каталогом Api/:

  • папка — сегмент URL
  • имя файла — HTTP-метод (Get.py, Post.py, …)
  • папка [id] — динамический сегмент
  • первая папка vN — версия API

Источник истины один — дерево, поэтому код и маршруты не могут разойтись. Что лежит в папке, то сервер и отдаёт.

Тонкие endpoint'ы, логика в сервисах

Endpoint должен распарсить вход, вызвать сервис и вернуть ответ. Больше ничего.

Это не вопрос вкуса. Версионирование копирует файлы endpoint'ов, так что вся бизнес-логика внутри них будет дублироваться с каждой новой версией. Держите логику в сервисах — и новая версия останется тонкой обёрткой над тем же ядром.

Версии — это папки

Версия — это папка vN, а не поле в конфиге. v1 и v2 — отдельные деревья, поэтому создание v2 физически не может изменить поведение v1. Старые клиенты продолжают работать — это гарантирует структура, а не дисциплина.

Одна зависимость ядра

Ядру нужен ровно один внешний пакет: uvicorn, HTTP-транспорт. Резолвер, загрузчик, Request/Response, middleware, ORM и CLI написаны на стандартной библиотеке. PostgreSQL, шифрование файлов, Redis, Celery и pydantic — опциональные extras.

Писать собственный HTTP-сервер не добавило бы идее ничего. uvicorn — разумная граница «с нуля».

Безопасность по умолчанию

ORM передаёт каждое значение через драйвер, проверяет и квотирует каждый идентификатор, принимает только известные lookup'ы, экранирует wildcard'ы в LIKE и приводит LIMIT/OFFSET к числам. Логгер маскирует пароли и токены до записи. Зашифрованные файлы бесполезны без ключа.

Ничего из этого не нужно включать.

Один сломанный файл не роняет приложение

Если файл endpoint'а не импортируется, ошибка попадает в сводку при старте, а остальное приложение запускается как обычно. endo check покажет, что сломано.


Чтобы увидеть эти идеи в деле, начните с Быстрого старта или соберите небольшое приложение в Туториале.