Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Bishwas-py/djapy

Open more actions menu

Repository files navigation

No Boilerplate, just rapid Django API ⚡️

Write powerful Django APIs with minimal code. Djapy combines Django's robustness with modern API development practices, giving you a clean, intuitive way to build REST APIs.

PyPI version Python Versions Django Versions License: MIT Downloads

@djapify
def get_user(request, username: str) -> UserSchema:
   return User.objects.get(username=username)

That's it. No serializers, no viewsets, no boilerplate - just pure Python.

✨ Why Djapy?

Write Django REST APIs that are simple by default, powerful when needed. Djapy works seamlessly with Django's ecosystem while adding modern API features.

# Works perfectly with Django decorators
@cache_page(BASIC_CACHE_1_HOUR)
@djapify
def get_posts(request, search: Optional[str] = None) -> List[PostSchema]:
   posts = Post.objects.all()
   if search:
      posts = posts.filter(title__icontains=search)
   return posts


# Need async? Just use async_djapify
@async_djapify
@paginate
async def get_comments(request, post_id: int) -> List[CommentSchema]:
   return await Comment.objects.filter(post_id=post_id).aall()

🚀 Key Features

  • Zero Boilerplate: Build APIs with pure Python
  • Django Native: Works seamlessly with Django's decorators and features
  • Type Safety: Full Python type hints with Pydantic
  • Async When You Need It: Optional async support for high-performance endpoints
  • Smart Authentication: Simple session auth, customizable when needed
  • OpenAPI Support: Automatic Swagger documentation
  • IDE Friendly: Full intellisense support

🎯 Quick Start

  1. Install Djapy
pip install djapy
  1. Create Your First API
from djapy import djapify, Schema


class PostSchema(Schema):
   title: str
   body: str
   author: str


@djapify
def create_post(request, data: PostSchema) -> {201: PostSchema}:
   post = Post.objects.create(**data.dict())
   return 201, post


# Want caching? Use Django's cache_page
@cache_page(3600)
@djapify
def get_post(request, post_id: int) -> PostSchema:
   return Post.objects.get(id=post_id)

🔥 Core Features

1. Simple by Default, Powerful When Needed

# Simple endpoint
@djapify
def get_tag(request, tag_slug: str) -> TagSchema:
   return Tags.objects.get(slug=tag_slug)


# Need more power? Add async and pagination
@async_djapify
@paginate
async def get_tag_posts(request, tag_slug: str) -> List[PostSchema]:
   tag = await Tags.objects.aget(slug=tag_slug)
   return await tag.posts.aall()

2. Works with Django's Ecosystem

from django.views.decorators.cache import cache_page
from django.views.decorators.csrf import csrf_exempt


@cache_page(3600)
@csrf_exempt
@djapify(method="POST")
def create_user(request, data: UserSchema) -> {201: UserSchema}:
   user = User.objects.create(**data.dict())
   return 201, user

3. Simple Authentication

@djapify(auth=SessionAuth)
def get_profile(request) -> ProfileSchema:
   return request.user.profile


# Need custom auth messages?
@djapify(auth=SessionAuth, msg={
   "message": "Please log in first",
   "redirect": "/login"
})
def protected_view(request) -> ProtectedSchema:
   return {"data": "secret"}

4. Type-Safe Responses

@djapify
def get_post(request, post_id: int) -> {
   200: PostSchema,
   404: MessageSchema
}:
   try:
      return Post.objects.get(id=post_id)
   except Post.DoesNotExist:
      return 404, {
         "message": "Post not found",
         "type": "error"
      }

🔄 Migration from DRF

DRF Concept Djapy Equivalent
ViewSets Simple function views with @djapify
Serializers Pydantic Schema models
Permissions Built-in auth system
Filters Native Python parameters
Pagination @paginate decorator

📚 Documentation

Visit djapy-docs.pages.dev/ for comprehensive documentation.

🤝 Community & Support

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.