Новый релиз django-modern-rest@0.16.0
Репозиторий: https://github.com/wemake-services/django-modern-rest
Документация: https://django-modern-rest.rtfd.io
Описание релиза: https://github.com/wemake-services/django-modern-rest/releases/tag/0.16.0
Статья на хабре про суть django-modern-rest: https://habr.com/ru/articles/1017036
Мы выпустили новый релиз. В нем мы значительно ускорили работу фреймворка, улучшили OpenAPI генерацию, добавили фичей для создания переиспользуемого кода.
Скорость
PydanticFastSerializer.deserializeв x2.2 быстрееPydanticFastSerializer.serializeв x1.33 быстрееНовый
BodyMsgspecкомпонент в x1.6 быстрее чемBodyНовый способ сериализации объектов через
MsgspecSerializerиmsgspec.Struct,gc=Falseв x2 раза быстрееContent negotiation в x1.2 быстрее для точных заголовков
Content negotiation в x65 быстрее для сложных
Acceptзаголовков
Дефолтные значения для компонентов
Теперь можно указывать дефолты для всех компонентов. Мы корректно отобразим их в OpenAPI спецификации:
class ProductController(Controller[MsgspecSerializer]): def post( self, parsed_body: Body[ProductFilters | None] = None, parsed_query: Query[Pagination] = DEFAULT_PAGINATION, ) -> dict[str, str | int]: ...
Готовые вьюхи для аутентификации
Например, чтобы получить Opaque Token по логину и паролю, достаточно всего лишь:
from dmr.security.token import concrete_views path( 'auth/', concrete_views.ObtainTokenSyncController.as_view( serializer=PydanticFastSerializer, ), )
Пагинация через курсор
Теперь мы поддерживаем два типа пагинации: LIMIT + OFFSET и cursor:
paginator = CursorPaginator( Entry.objects.order_by('rank', 'name'), per_page=parsed_query.limit, ) page = paginator.page(parsed_query.cursor) # or: await paginator.apage(...) return CursorPaginated(next_cursor=page.next_cursor, per_page=..., page=[...])
Extras
Создавайте свои контроллеры со своими настройками, мы добавили типизированное поле extras в @modify и @validate:
modify: Final = ModifyEndpoint(SmartResponse) class APIController(Controller[PydanticFastSerializer]): extras = SmartResponse() @modify(extras=SmartResponse(response_text='from endpoint')) def post(self) -> str: return SmartResponse.of(self)
OpenAPI теперь умеет добавлять любые x- значения
Поддерживаем любые кастомные значения:
class UserController(Controller[MsgspecSerializer]): x_extensions: ClassVar = {'x-owner': 'users-team'} # on the path item @modify(x_extensions={'x-rate-limit': 100}) # on the operation def post(self, parsed_body: Body[UserModel]) -> UserModel: ...
Поддержка library-skills
Установите наши скиллы одной командой:
uvx library-skills --claude # -> .agents/skills/dmr, .claude/skills/...
Делаем разработку с ИИ-агентами - проще!
Буду рад обратной связи в комментах! Какая фича ваша любимая? Чего вам не хватает для следующих релизов?














