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 fastdjango

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 básico
  • Auth completo
  • Sessions
  • Middleware
  • Templates (Jinja2)
  • WebSocket
  • CLI
  • Forms/Schemas
  • Migrations melhoradas (Aerich)
  • Admin completo
  • Signals async
  • Cache
  • Email
  • 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.0.tar.gz (74.8 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.0-py3-none-any.whl (87.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: django_fastapi_async-0.2.0.tar.gz
  • Upload date:
  • Size: 74.8 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.0.tar.gz
Algorithm Hash digest
SHA256 f10a5667f098e73df18037bf7a6952cac52627a8a9827f302949e43e81131dae
MD5 fc6f48e9f49a64b6de0da56d8a603355
BLAKE2b-256 e104f90cc7566efc229876f2c7e31680de6d2b85b2468b92ec2996b3fc775cc5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for django_fastapi_async-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 88efe9f6d15b43144be1f37ffa6de445c31435ad61da7c91c6252868ce16265c
MD5 788d90cf36930cd4b31fb254b816d7ec
BLAKE2b-256 0207d21f458a4c76ad3f14011de1df945cc9c69dddf209a4080ea8df800f30cc

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