Modern REST framework for Django with types and async support!
Features
- [x] Blazingly fast
- [x] Supports
django>=4.2 - [x] Supports
pydantic2,msgspec,attrs,dataclasses,TypedDictas model schemas, but not bound to any of these libraries - [x] Supports async Django without any
sync_to_asynccalls inside, tested to work with free-threading builds - [x] Fully typed and checked with
mypy,pyright, andpyreflyin strict modes - [x] Supports content negotiation, has default implementations for
json,msgpack, SSE, Json Lines, and more - [x] Strict schema validation of both requests and responses, including errors
- [x] Supports OpenAPI 3.1 / 3.2 semantic schema generation out of the box
- [x] Supports all your existing
djangoprimitives and packages, no custom runtimes - [x] Great testing tools with schemathesis, polyfactory, bundled
pytestplugin, and default Django's testing primitives - [x] 100% test coverage with 1900+ of carefully designed unit, integration, and property-based tests
- [x] High security standards
- [x] Built by the community for the community, not a single-person project
- [x] Great docs
- [x] No AI slop, but built for the LLM era
- [x] No emojis 🌚️️
Testimonials
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
Installation
Works for: - CPython 3.11+ or PyPy 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
- 'django-modern-rest[attrs]' provides attrs support
- 'django-modern-rest[jwt]' provides pyjwt auth support
- 'django-modern-rest[openapi]' provides OpenAPI schema validation,
yaml OpenAPI view,
and generates better OpenAPI examples with polyfactory
Example
The shortest example (click here to copy the whole file):
>>> import uuid
>>> import pydantic
>>> from dmr import Body, Controller, Headers
>>> # Or use `dmr.plugins.msgspec` or write your own!
>>> from dmr.plugins.pydantic import PydanticFastSerializer
>>> class UserCreateModel(pydantic.BaseModel):
... email: str
>>> class UserModel(UserCreateModel):
... uid: uuid.UUID
... consumer: str
>>> class HeaderModel(pydantic.BaseModel):
... consumer: str = pydantic.Field(alias='X-API-Consumer')
>>> class UserController(Controller[PydanticFastSerializer]):
... async def post( # <- can be sync as well!
... self,
... parsed_body: Body[UserCreateModel],
... parsed_headers: Headers[HeaderModel],
... ) -> UserModel:
... """All added props have the correct runtime and static types."""
... return UserModel(
... uid=uuid.uuid4(),
... email=parsed_body.email,
... consumer=parsed_headers.consumer,
... )
And then route this controller in your urls.py:
>>> from django.urls import include, path
>>> from dmr.routing import Router
>>> router = Router(
... 'api/',
... [
... path('user/', UserController.as_view(), name='users'),
... ],
... )
>>> urlpatterns = [
... path(router.prefix, include((router.urls, 'my_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!
- awesome-django-modern-rest - a curated list of resources related to django-modern-rest!
License
Credits
This project was generated with wemake-python-package. Current template version is: e1fcf312d7f715323dcff0d376a40b7e3b47f9b7. See what is updated since then.