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

EndoCore

Файловый ASGI backend-фреймворк — дерево папок является API.

Никаких роутеров, декораторов и конфигов регистрации. Положил файл в нужную папку — endpoint появился. Роутинг, версионирование и CLI — это просто операции над одним деревом каталогов.

Чистый ASGI · одна зависимость ядра (uvicorn) · безопасная ORM · DI · WebSockets · кэш · OpenAPI · миграции · 1600+ тестов.

Начать Туториал vs FastAPI Discord


Идея за десять секунд

Api/
  v1/
    User/
      Role/
        Get.py      # GET  /v1/user/role
        Post.py     # POST /v1/user/role
      [id]/
        Get.py      # GET  /v1/user/42   ->  id = "42"
# Api/v1/User/Role/Get.py
from endocore import Request, Response

async def handler(request: Request) -> Response:
    return Response.json({"roles": ["admin", "editor", "viewer"]})
endo dev            # http://127.0.0.1:8000

Папка — это URL, имя файла — HTTP-метод, [id] захватывает значение, а первая папка vN — версия API. Это вся модель роутинга.


Почему EndoCore

  • Файл = маршрут

    Структура и есть API. Что видно в дереве — ровно то и отдаёт сервер. Ни скрытой регистрации, ни расхождения между кодом и маршрутами.

  • Безопасная ORM (SQLite + PostgreSQL)

    В стиле Django, но с приоритетом безопасности: любое значение биндится драйвером, идентификаторы валидируются и квотируются, операторы — из белого списка. Готова к async.

  • Внедрение зависимостей

    Depends(...) как в FastAPI плюс провайдеры уровня приложения — вложенные, кэшируются на запрос, резолвятся по типу или имени.

  • Батарейки в комплекте

    WebSockets + pub/sub, кэш (память/Redis), middleware CORS/CSRF/gzip/rate-limit, cookies, фоновые задачи, миграции с откатом, OpenAPI.


Немного об ORM

from endocore.orm import Model, fields, configure, create_all, Count

class Author(Model):
    name = fields.CharField(max_length=100)

class Book(Model):
    title  = fields.CharField(max_length=200)
    author = fields.ForeignKey(Author, related_name="books")

configure(backend="sqlite", database="app.db")
create_all(Author, Book)

Author.objects.create(name="Ada")
Book.objects.filter(author__name="Ada")             # кросс-табличный lookup (JOIN)
Author.objects.annotate(n=Count("books"))           # агрегат по связи
await Book.objects.aget(id=1)                        # async (неблокирующий)

Установка

pip install endocore
# экстры: pip install "endocore[postgres,files,redis,pydantic]"

Первый раз здесь? Идите по порядку:

  1. Установка — один pip install.
  2. Быстрый старт — рабочий API за минуту.
  3. Туториал — небольшой API блога целиком: модели, сервисы, middleware, версии, тесты.

Статус

EndoCore — версия 1.0: публичный API, задокументированный в справочнике, теперь покрыт semver. Поставляется с 2300+ тестами, покрывающими роутинг, ORM (оба диалекта, тесты на инъекции), миграции, middleware, DI, кэш и WebSockets.

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

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