Новый релиз 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/...
Делаем разработку с ИИ-агентами — проще!
Буду рад обратной связи в комментах! Какая фича ваша любимая? Чего вам не хватает для следующих релизов?