Skip to main content

Django-like framework built on FastAPI - 100% async

Project description

FastDjango

Python 3.11+ License: MIT GitHub Stars GitHub Issues

Django-like framework built on FastAPI - 100% async

FastDjango combina a facilidade de uso do Django com a performance do FastAPI. WebSocket nativo, ORM async, admin automático, e tudo que você precisa para construir aplicações web modernas.

Features

  • 100% Async - Baseado em FastAPI/Starlette, totalmente assíncrono
  • ORM Django-like - Sintaxe familiar: Model.objects.filter(...)
  • Admin Automático - CRUD gerado automaticamente dos models
  • Autenticação Completa - User, Group, Permission, sessions, JWT
  • WebSocket Nativo - Sem precisar de Channels
  • Templates Jinja2 - Com filtros e tags estilo Django
  • CLI Completo - startproject, startapp, migrate, runserver, etc.
  • Forms/Schemas - Pydantic integrado com API Django-like

Instalação

pip install django-fastapi-async

Quick Start

Criar projeto

fastdjango startproject meusite
cd meusite

Criar app

fastdjango startapp blog

Definir models

# blog/models.py
from fastdjango.db.models import Model
from fastdjango.db import fields

class Post(Model):
    title = fields.CharField(max_length=200)
    content = fields.TextField()
    published = fields.BooleanField(default=False)
    created_at = fields.DateTimeField(auto_now_add=True)

    class Meta:
        table = "blog_post"
        ordering = ["-created_at"]

    class Admin:
        list_display = ["title", "published", "created_at"]
        search_fields = ["title", "content"]

Criar rotas

# blog/routes.py
from fastapi import Request, WebSocket
from fastdjango.routing import Router
from fastdjango.templates import render
from fastdjango.contrib.auth.decorators import login_required

from .models import Post

router = Router()

# HTML view
@router.get("/")
async def index(request: Request):
    posts = await Post.objects.filter(published=True)
    return render("blog/index.html", {"posts": posts}, request=request)

# API endpoint
@router.get("/api/posts")
async def list_posts():
    return await Post.objects.filter(published=True)

# Protected route
@router.post("/api/posts")
@login_required
async def create_post(request: Request, data: PostCreate):
    return await Post.objects.create(**data.model_dump(), author=request.state.user)

# WebSocket
@router.websocket("/ws/live")
async def live_updates(websocket: WebSocket):
    await websocket.accept()
    async for message in websocket.iter_text():
        await websocket.send_text(f"Received: {message}")

Configurar admin

# blog/admin.py
from fastdjango.contrib.admin import register, ModelAdmin
from .models import Post

@register(Post)
class PostAdmin(ModelAdmin):
    list_display = ["title", "published", "created_at"]
    list_filter = ["published"]
    search_fields = ["title", "content"]

Rodar

fastdjango migrate
fastdjango createsuperuser
fastdjango runserver

Acesse:

Comparação com Django

Feature Django FastDjango
ORM Síncrono Async nativo
Performance Boa Excelente
WebSocket Channels (separado) Nativo
API DRF (separado) Integrado (FastAPI)
Tipagem Parcial Completa (Pydantic)
Docs API Manual Automática (OpenAPI)
Admin Excelente Bom (em desenvolvimento)
Maturidade Alta Inicial

Estrutura do Projeto

meusite/
├── manage.py
├── meusite/
│   ├── __init__.py
│   ├── settings.py      # Configurações (igual Django)
│   ├── urls.py          # URL patterns
│   └── asgi.py          # ASGI application
├── blog/
│   ├── __init__.py
│   ├── models.py        # Models ORM
│   ├── routes.py        # Views/API endpoints
│   ├── schemas.py       # Pydantic schemas
│   ├── admin.py         # Admin config
│   └── templates/
│       └── blog/
│           └── index.html
└── templates/
    └── base.html

Settings

# settings.py
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = "your-secret-key"
DEBUG = True

INSTALLED_APPS = [
    "fastdjango.contrib.admin",
    "fastdjango.contrib.auth",
    "fastdjango.contrib.sessions",
    "blog",
]

MIDDLEWARE = [
    "fastdjango.middleware.SessionMiddleware",
    "fastdjango.middleware.AuthMiddleware",
    "fastdjango.middleware.CSRFMiddleware",
]

DATABASES = {
    "default": {
        "ENGINE": "asyncpg",  # ou aiosqlite, asyncmy
        "NAME": "meusite",
        "USER": "postgres",
        "PASSWORD": "senha",
        "HOST": "localhost",
    }
}

ORM

# Queries (igual Django, mas async)
posts = await Post.objects.all()
posts = await Post.objects.filter(published=True)
posts = await Post.objects.filter(title__icontains="python")
posts = await Post.objects.exclude(published=False)
posts = await Post.objects.order_by("-created_at")

# Relacionamentos
posts = await Post.objects.select_related("author")
posts = await Post.objects.prefetch_related("comments")

# CRUD
post = await Post.objects.create(title="Hello", content="World")
post = await Post.objects.get(pk=1)
post = await Post.objects.get_or_404(pk=1)
await post.save()
await post.delete()

# Aggregations
from tortoise.functions import Count, Avg
posts = await Post.objects.annotate(comment_count=Count("comments"))

Autenticação

from fastdjango.contrib.auth import authenticate, login, logout
from fastdjango.contrib.auth.decorators import login_required, permission_required

# Login
user = await authenticate(request, username="john", password="secret")
if user:
    await login(request, user)

# Logout
await logout(request)

# Decorators
@router.get("/profile")
@login_required
async def profile(request: Request):
    return {"user": request.state.user.username}

@router.post("/admin/posts")
@permission_required("blog.add_post")
async def admin_create_post(request: Request):
    ...

WebSocket

from fastdjango.routing.websocket import ConnectionManager

manager = ConnectionManager()

@router.websocket("/ws/chat/{room}")
async def chat(websocket: WebSocket, room: str):
    await manager.connect(websocket, group=room)
    try:
        async for message in websocket.iter_text():
            # Broadcast para todos no room
            await manager.broadcast(message, room)
    except WebSocketDisconnect:
        manager.disconnect(websocket, room)

CLI Commands

fastdjango startproject <name>    # Criar projeto
fastdjango startapp <name>        # Criar app
fastdjango runserver              # Rodar servidor
fastdjango migrate                # Aplicar migrations
fastdjango makemigrations         # Criar migrations
fastdjango createsuperuser        # Criar superusuário
fastdjango shell                  # Shell interativo
fastdjango collectstatic          # Coletar static files

Roadmap

  • Core framework
  • ORM wrapper (Tortoise)
  • Admin completo (com filtros e inlines)
  • Auth completo (User, Group, Permission, JWT)
  • Sessions (cookie e database)
  • Middleware (CSRF, CORS, Auth)
  • Templates (Jinja2)
  • WebSocket nativo
  • CLI completo
  • Forms/Schemas (Pydantic)
  • Migrations (Aerich)
  • Signals async
  • Cache (Memory, Redis, File, Database)
  • Email (SMTP, Console, File)
  • Testes
  • Documentação completa

Contribuindo

Contribuições são bem-vindas! Veja CONTRIBUTING.md para detalhes.

Links

Licença

MIT License - veja LICENSE para detalhes.

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_fastapi_async-0.2.2.tar.gz (94.4 kB view details)

Uploaded Source

Built Distribution

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

django_fastapi_async-0.2.2-py3-none-any.whl (100.6 kB view details)

Uploaded Python 3

File details

Details for the file django_fastapi_async-0.2.2.tar.gz.

File metadata

  • Download URL: django_fastapi_async-0.2.2.tar.gz
  • Upload date:
  • Size: 94.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.1

File hashes

Hashes for django_fastapi_async-0.2.2.tar.gz
Algorithm Hash digest
SHA256 5887ca45f80eda1f060911374bcdb92fe6ed6ccc57c7a8fc0c5a8f67262b467f
MD5 5dde1bf5a5e69b45d86ccc23b5ea2e5d
BLAKE2b-256 75fa4bc0fc137092db30026a4c235b9571bb3cdc03ced66c059c9f298113540f

See more details on using hashes here.

File details

Details for the file django_fastapi_async-0.2.2-py3-none-any.whl.

File metadata

File hashes

Hashes for django_fastapi_async-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 44e55b017a633c9efa31dab0e5789a50dab063ce4e354a49456c82e152e9ece6
MD5 2a4e0b28ca0056f073a564147c50525c
BLAKE2b-256 1adf0e792fff1a023fac391f83957807da770d21dce08828d9838ceb570a4604

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