Django Ninja is a FastAPI-inspired web framework for Django that adds automatic OpenAPI docs, async support, and type-safe request handling. If you're still writing Django REST Framework serializers, you're working too hard.
Why Django Ninja?
Django Ninja gives you FastAPI's developer experience inside Django's battle-tested ecosystem. Same ORM, same admin, same middleware — but with modern API design.
The Free APIs You're Missing
1. Type-Safe Request Handling with Pydantic
from ninja import NinjaAPI, Schema
from datetime import date
api = NinjaAPI()
class UserIn(Schema):
name: str
email: str
age: int = None
class UserOut(Schema):
id: int
name: str
email: str
@api.post("/users", response=UserOut)
def create_user(request, data: UserIn):
user = User.objects.create(**data.dict())
return user
Automatic validation, serialization, and OpenAPI documentation. No serializer classes needed.
2. Async Views — Native async/await
import httpx
from ninja import NinjaAPI
api = NinjaAPI()
@api.get("/external-data")
async def get_external(request):
async with httpx.AsyncClient() as client:
resp = await client.get("https://api.example.com/data")
return resp.json()
Full async support without leaving Django. Mix sync and async views freely.
3. Router — Modular API Organization
from ninja import Router
users_router = Router(tags=["users"])
orders_router = Router(tags=["orders"])
@users_router.get("/")
def list_users(request):
return User.objects.all()
@orders_router.get("/")
def list_orders(request):
return Order.objects.all()
# main api.py
api.add_router("/users", users_router)
api.add_router("/orders", orders_router)
4. Authentication — Built-In Auth Schemes
from ninja.security import HttpBearer, APIKeyQuery
class AuthBearer(HttpBearer):
def authenticate(self, request, token):
if token == "valid-token":
return token
return None
@api.get("/protected", auth=AuthBearer())
def protected(request):
return {"message": "authenticated"}
JWT, API key, session auth — all built in with automatic OpenAPI security schemes.
5. Pagination — Automatic with Zero Config
from ninja.pagination import paginate, PageNumberPagination
@api.get("/users", response=list[UserOut])
@paginate(PageNumberPagination)
def list_users(request):
return User.objects.all()
Getting Started
pip install django-ninja
Add to urls.py and you're done. Full OpenAPI docs at /api/docs.
Need data from any website delivered as clean JSON? I build production web scrapers that handle anti-bot, proxies, and rate limits. 77 scrapers running in production. Email me: Spinov001@gmail.com
Check out my awesome-web-scraping list for the best scraping tools and resources.
Top comments (0)