Django-like framework built on FastAPI - 100% async
Project description
FastDjango
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:
- Site: http://localhost:8000
- Admin: http://localhost:8000/admin
- API Docs: http://localhost:8000/api/docs
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
- GitHub: https://github.com/TWFBusiness/fastdjango
- Issues: https://github.com/TWFBusiness/fastdjango/issues
- Discussions: https://github.com/TWFBusiness/fastdjango/discussions
Licença
MIT License - veja LICENSE para detalhes.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5887ca45f80eda1f060911374bcdb92fe6ed6ccc57c7a8fc0c5a8f67262b467f
|
|
| MD5 |
5dde1bf5a5e69b45d86ccc23b5ea2e5d
|
|
| BLAKE2b-256 |
75fa4bc0fc137092db30026a4c235b9571bb3cdc03ced66c059c9f298113540f
|
File details
Details for the file django_fastapi_async-0.2.2-py3-none-any.whl.
File metadata
- Download URL: django_fastapi_async-0.2.2-py3-none-any.whl
- Upload date:
- Size: 100.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44e55b017a633c9efa31dab0e5789a50dab063ce4e354a49456c82e152e9ece6
|
|
| MD5 |
2a4e0b28ca0056f073a564147c50525c
|
|
| BLAKE2b-256 |
1adf0e792fff1a023fac391f83957807da770d21dce08828d9838ceb570a4604
|