DEV Community

Alex Spinov
Alex Spinov

Posted on

Django Ninja Has a Free API You're Not Using

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
Enter fullscreen mode Exit fullscreen mode

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()
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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"}
Enter fullscreen mode Exit fullscreen mode

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()
Enter fullscreen mode Exit fullscreen mode

Getting Started

pip install django-ninja
Enter fullscreen mode Exit fullscreen mode

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)