Modern REST framework for Django with types and async support!
Modern REST framework for Django with types and async support!
mypy and pyright in strict modesdjango>=5.2pydantic2, but not bound to itmsgspec, but not bound to itsync_to_async calls insideopenapi 3.1+ schema generation out of the boxdjango primitives and packages, no custom runtimespytest plugin, and default Django's testing primitivesSync mode
The one thing I really love about django-modern-rest is its pluggable serializers and validators. Frameworks that are tightly coupled with pydantic can be really painful to work with.
— Kirill Podoprigora, CPython core developer
Using
django-modern-resthas been a game-changer for my productivity. The strict type safety and schema validation for both requests and responses mean I spend less time debugging and more time building.
— Josiah Kaviani, Django core developer
Works for: - CPython 3.11+ - Django 5.2+
pip install django-modern-rest
There are several included extras:
- 'django-modern-rest[msgspec]' provides msgspec support
and the fastest json parsing, recommended to be always included
- 'django-modern-rest[pydantic]' provides pydantic support
The shortest example:
>>> import uuid
>>> import pydantic
>>> from django_modern_rest import Body, Controller, Headers
>>> # Or use `django_modern_rest.plugins.msgspec` or write your own!
>>> from django_modern_rest.plugins.pydantic import PydanticSerializer
>>> class UserCreateModel(pydantic.BaseModel):
... email: str
>>> class UserModel(UserCreateModel):
... uid: uuid.UUID
>>> class HeaderModel(pydantic.BaseModel):
... consumer: str = pydantic.Field(alias='X-API-Consumer')
>>> class UserController(
... Controller[PydanticSerializer],
... Body[UserCreateModel],
... Headers[HeaderModel],
... ):
... def post(self) -> UserModel: # <- can be async as well!
... """All added props have the correct runtime and static types."""
... assert self.parsed_headers.consumer == 'my-api'
... return UserModel(uid=uuid.uuid4(), email=self.parsed_body.email)
And then route this controller in your urls.py:
>>> from django.urls import include, path
>>> from django_modern_rest.routing import Router
>>> router = Router([
... path('user/', UserController.as_view(), name='users'),
... ])
>>> urlpatterns = [
... path('api/', include((router.urls, 'your_app'), namespace='api')),
... ]
Done! Now you have your shiny API with 100% type safe validation and interactive docs.
Next steps:
- The full documentation has everything you need to get started!
- wemake-django-template can be used to jump-start your new project with django-modern-rest!
This project was generated with wemake-python-package. Current template version is: e1fcf312d7f715323dcff0d376a40b7e3b47f9b7. See what is updated since then.