Skip to main content

Modern REST framework for Django with types and async support

Project description

Modern REST Logo - Light Modern REST Logo - Dark

Modern REST framework for Django with types and async support!

wemake.services Modern REST test codecov PyPI Downloads Python Version wemake-python-styleguide Ask DeepWiki

Features

  • Blazingly fast
  • Supports django>=5.2
  • Supports pydantic2, msgspec, attrs, dataclasses, TypedDict as model schemas, but not bound to any of the these libraries
  • Supports async Django without any sync_to_async calls inside, tested to work with free-threading builds
  • Fully typed and checked with mypy, pyright, and pyrefly in strict modes
  • Supports content negotiation, has default implementations for json, msgpack, SSE, Json Lines, and more
  • Strict schema validation of both requests and responses
  • Supports openapi 3.1+ schema generation out of the box
  • Supports all your existing django primitives and packages, no custom runtimes
  • Great testing tools with schemathesis, polyfactory, bundled pytest plugin, and default Django's testing primitives
  • 100% test coverage with 1700+ of carefully designed unit, integration, and property-based tests
  • Built by the community for the community, not a single-person project
  • Great docs
  • No AI slop, but built for the LLM era
  • No emojis 🌚️️

Benchmark - Light Benchmark - Dark

Sync mode

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-rest has 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+
  • 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
  • 'django-modern-rest[attrs]' provides attrs support
  • 'django-modern-rest[jwt]' provides pyjwt auth support
  • 'django-modern-rest[openapi]' provides OpenAPI schema validation 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 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]):
...     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."""
...         assert parsed_headers.consumer == 'my-api'
...         return UserModel(uid=uuid.uuid4(), email=parsed_body.email)

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:

License

MIT

Credits

This project was generated with wemake-python-package. Current template version is: e1fcf312d7f715323dcff0d376a40b7e3b47f9b7. See what is updated since then.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_modern_rest-0.4.0.tar.gz (2.8 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_modern_rest-0.4.0-py3-none-any.whl (2.8 MB view details)

Uploaded Python 3

File details

Details for the file django_modern_rest-0.4.0.tar.gz.

File metadata

  • Download URL: django_modern_rest-0.4.0.tar.gz
  • Upload date:
  • Size: 2.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.3 CPython/3.11.9 Darwin/24.6.0

File hashes

Hashes for django_modern_rest-0.4.0.tar.gz
Algorithm Hash digest
SHA256 1f8c3edeb63102988a02a80796c3b8bba479e4d3e8c74395d7e43ed495142eba
MD5 9c64f9ae39388aa2c7f5635ab47cd15c
BLAKE2b-256 44f73cd27da157cefbd7fe882f703d7cf260a271c3443c67312c57eeedb35bf3

See more details on using hashes here.

File details

Details for the file django_modern_rest-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: django_modern_rest-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 2.8 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.3 CPython/3.11.9 Darwin/24.6.0

File hashes

Hashes for django_modern_rest-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 451f8755c8601ed94e52a0ec83428c580d9eafab336b053164802172e239d69d
MD5 53271f937cf6ed46f2b751ab714653a7
BLAKE2b-256 e8b8c6a1ebe4ba62ce7ddd42a5a22484ee4ae8705daef8712e550428eb711b93

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page