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 modespydantic2, 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 4.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.