
Opinionated ΡΡΠ°ΡΡΠΎΠ²ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ Django 5.2 Ρ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ ΡΡΠ΅ΠΊΠΎΠΌ: DRF + SimpleJWT, Unfold admin, ΠΌΠ½ΠΎΠ³ΠΎΡΠ·ΡΡΠΈΠ΅ ( modeltranslation), CKEditor 5, Redis cache, Celery, Swagger / Redoc (drf-spectacular), PostgreSQL, Docker, Taskfile, ruff, mypy, pytest.
English summary: Ready-to-use Django 5.2 boilerplate with REST, JWT auth, multilingual setup, async tasks, rich admin & tooling.
uvx --from go-task-bin taskΠΠΎΡΠΎΠ²ΡΠΉ ΡΡΠ΅ΠΊ / ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΌ backend ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ:
core ΠΈ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² apps/.users.User.assets/locale.uv (Π±ΡΡΡΡΠ΅Π΅ pip + lock-ΡΠ°ΠΉΠ»).createadmin, makeapp, nginx, secret_key.src/
core/ # Django settings, celery init, ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ (jwt, cache, swagger ...)
apps/
shared/ # ΠΠ±ΡΠΈΠ΅ ΡΡΠΈΠ»ΠΈΡΡ/Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ
users/ # ΠΠ°ΡΡΠΎΠΌΠ½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ°
assets/
static/ # ΠΡΡ
ΠΎΠ΄Π½ΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ
staticfiles/ # Π‘ΠΎΠ±ΡΠ°Π½Π½ΡΠ΅ ΡΡΠ°ΡΠΈΠΊΠΈ (collectstatic)
locale/ # Π€Π°ΠΉΠ»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ² (.po/.mo)
deployments/compose/ # Dockerfile + ΡΠΊΡΠΈΠΏΡΡ Π·Π°ΠΏΡΡΠΊΠ°
Taskfile.yml # ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄
pyproject.toml # ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
uv sync
# Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ .env (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ)
cp .env.example .env # Π΅ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ
# ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠΏΠ΅ΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
uv run python src/manage.py migrate
uv run python src/manage.py createsuperuser
# ΠΠ°ΠΏΡΡΠΊ dev-ΡΠ΅ΡΠ²Π΅ΡΠ°
uv run python src/manage.py runserver 0.0.0.0:8000
# ΠΠ°ΠΏΡΡΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π²Π΅Π± + postgres
docker compose up -d --build
# ΠΠΎΠ³ΠΈ
docker compose logs -f web
# ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ (Π΅ΡΠ»ΠΈ Π½Π΅ Π² entrypoint)
docker compose exec web python manage.py migrate
# Π‘ΠΎΠ·Π΄Π°ΡΡ Π°Π΄ΠΌΠΈΠ½Π°
docker compose exec web python manage.py createadmin
Π docker-compose.yml ΡΠ°ΡΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ Π±Π»ΠΎΠΊΠΈ: redis, rabbitmq, celery_worker, celery_beat,
celery_flower. ΠΠ°ΡΠ΅ΠΌ:
docker compose up -d --build
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ (ΠΏΡΠΈΠΌΠ΅Ρ .env):
SECRET_KEY=changeme
DEBUG=true
ALLOWED_HOSTS=localhost,127.0.0.1
CSRF_TRUSTED_ORIGINS=http://localhost:8000
POSTGRES_DB=django
POSTGRES_USER=django
POSTGRES_PASSWORD=django
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
# ΠΠ΅Ρ / Celery (Redis)
REDIS_CACHE_URL=redis://redis:6379/1
CACHE_TIMEOUT=300
CELERY_BROKER=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/0
# RabbitMQ (Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅)
RABBITMQ_DEFAULT_USER=guest
RABBITMQ_DEFAULT_PASS=guest
# ΠΠΎΡΡΡ
PORT=8001
CELERY_FLOWER=5555
ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Π²Π½Π΅ΡΠ½ΠΈΠΉ Π±ΡΠΎΠΊΠ΅Ρ (RabbitMQ) β ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ CELERY_BROKER Π½Π° amqp://user:pass@rabbitmq:5672//.
ΠΠΎΠΌΠ°Π½Π΄Ρ:
uv sync # ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π²ΡΠ΅ Π³ΡΡΠΏΠΏΡ (dev, test, lint, typecheck)
uv add <pkg> # Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ
uv remove <pkg> # ΡΠ΄Π°Π»ΠΈΡΡ
uv pip compile # ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ lock (Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ Π²ΡΡΡΠ½ΡΡ)
| ΠΠΎΠΌΠ°Π½Π΄Π° | ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ |
|---|---|
makeapp <name> |
Π‘ΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² apps/, ΡΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ apps.py |
secret_key |
Π‘Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ SECRET_KEY |
ΠΠ°ΠΏΡΡΠΊ:
python manage.py makeapp blog
ΠΠΎΡΡΡΠΏΠ½ΠΎ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ°:
/api/schema/swagger-ui//api/schema/redoc//api/schema/ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ β core/config/swagger.py (ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ°ΡΡΠΈΡΡΡΠ΅).
ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ Π² core/config/jwt.py.
Authorization: Bearer <token>ΠΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° (Π΅ΡΠ»ΠΈ Π½Π°ΡΡΡΠΎΠ΅Π½ ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ):
POST /api/auth/token/ {"username": "...", "password": "..."}
assets/locale/<lang>/LC_MESSAGES/django.poMODELTRANSLATION_LANGUAGES = ("uz", "ru", "en")uzΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ / ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ:
python manage.py makemessages -l ru -l uz -l en
python manage.py compilemessages
Rosetta ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ ΡΠ΅ΡΠ΅Π· UI.
Π Π°ΡΡΠΈΡΠ΅Π½Π½ΡΠΉ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ UI. ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ β ΡΠΌ. ΡΠ°ΠΉΠ» core/config/unfold_navigation.py.
ΠΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΠΏΠΈΡΠΊΠΈ INSTALLED_APPS (ΡΠ΅ΡΠ΅Π· PROJECT_APPS).
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ CKEditor5Field Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ
ΠΏΠΎΠ»Π΅ΠΉ:
from django_ckeditor_5.fields import CKEditor5Field
body = CKEditor5Field(config_name="default")
ΠΠ°ΡΡΡΠΎΠΉΠΊΡ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ½Π΅ΡΡΠΈ Π² core/config/ckeditor5.py.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² core/config/cache.py. ΠΡΠΈΠΌΠ΅Ρ ΡΡΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
from django.core.cache import cache
cache.set("key", "value", 60)
value = cache.get("key")
Π‘Π΅ΡΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ΅ΡΠ΅Π· ΠΊΠ΅Ρ (SESSION_ENGINE).
ΠΡΠΈΠΌΠ΅Ρ Π·Π°Π΄Π°ΡΠΈ:
# apps/shared/tasks.py
from celery import shared_task
@shared_task
def add(x, y):
return x + y
ΠΠ°ΠΏΡΡΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ:
celery -A core worker -l info
celery -A core beat -l info
Flower (ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³):
celery -A core flower --port=5555
Taskfile ΡΠ΅Π»ΠΈ:
task lint # ruff check
task format # Π°Π²ΡΠΎΡΠΎΡΠΌΠ°Ρ + ΡΠΈΠΊΡΡ
task typecheck # mypy
task deptry # Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
task all # ΠΏΠΎΠ»Π½ΡΠΉ Π½Π°Π±ΠΎΡ (ΠΊΠ°ΠΊ CI)
Π‘ΠΎΠ·Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ΅ΡΡΡ Π² tests/ ΠΈΠ»ΠΈ Π²Π½ΡΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (apps/<app>/tests/). ΠΠ°ΠΏΡΡΠΊ:
uv run pytest -vv
ΠΠΎΠΊΡΡΡΠΈΠ΅ (ΠΏΡΠΈΠΌΠ΅Ρ):
uv run pytest --cov=apps --cov-report=term-missing
Π Π°ΡΡΠΈΡΡΠΉΡΠ΅ core/config/logs.py (Π΅ΡΠ»ΠΈ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ) Π΄Π»Ρ JSON-ΡΠΎΡΠΌΠ°ΡΠ°. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Sentry / OpenTelemetry
Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅.
collectstatic ΠΈ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π² entrypoint./healthz).ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
python manage.py makeapp blog
ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π΅Π³ΠΎ Π² Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Unfold ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ.
ΠΠ²ΡΠΎΡ: Jahongir Hakimjonov
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠ°ΡΡ:
</a>
MIT β ΡΠΌ. ΡΠ°ΠΉΠ» LICENSE.
PR ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ!