Шаблон для быстрого старта Django + DRF проекта. Из коробки — JWT-аутентификация, Swagger-документация, красивая админка и полная настройка через .env. Никаких захардкоженных секретов и настроек в коде.
- Стек
- Быстрый старт
- Переменные окружения
- База данных
- Docker
- Аутентификация
- API-документация
- Создание нового приложения
- Структура проекта
- Тесты и CI
- Деплой
- Лицензия
| Пакет | Назначение |
|---|---|
| Django | Основной фреймворк |
| Django REST Framework | REST API |
| djoser | Готовые эндпоинты аутентификации |
| djangorestframework-simplejwt | JWT-токены |
| drf-yasg | Swagger / ReDoc документация |
| django-environ | Чтение настроек из .env |
| django-jazzmin | Тема для Django Admin |
| Pillow | Работа с изображениями |
| psycopg2-binary | Драйвер PostgreSQL |
# 1. Создать папку проекта и клонировать шаблон
mkdir my-project
cd my-project
git clone https://github.com/marse11e/django-project-template-v2 .
# 2. Создать и активировать виртуальное окружение
python -m venv .venv
source .venv/bin/activate # Linux / macOS
.venv\Scripts\activate # Windows
# 3. Установить зависимости
pip install -r requirements.txt
# 4. Настроить переменные окружения
cp .env.example .env
# Открой .env и при необходимости измени значения
# 5. Применить миграции
python manage.py migrate
# 6. Запустить сервер
python manage.py runserverПроект доступен на http://127.0.0.1:8000.
mkdir my-project
cd my-project
git clone https://github.com/marse11e/django-project-template-v2 .
cp .env.example .env
docker compose up --buildПроект доступен на http://localhost:8000. PostgreSQL и миграции поднимаются автоматически.
Все настройки проекта задаются через файл .env. Шаблон со всеми переменными находится в .env.example.
cp .env.example .env| Переменная | По умолчанию | Обязательно менять перед продом | Описание |
|---|---|---|---|
SECRET_KEY |
(задан в .env.example) | Да | Секретный ключ Django. Генерируй новый для каждого проекта. |
DEBUG |
True |
Да | Режим отладки. В продакшне всегда False. |
ALLOWED_HOSTS |
127.0.0.1,localhost |
Да | Разрешённые хосты через запятую. В продакшне — реальный домен. |
DATABASE_URL |
(не задан → SQLite) | Нет | URL подключения к БД. Не задан — используется SQLite. |
STATIC_ROOT |
staticfiles |
Нет | Папка для collectstatic. |
MEDIA_ROOT |
media |
Нет | Папка для загружаемых файлов. |
LANGUAGE_CODE |
ru |
Нет | Язык интерфейса Django. |
TIME_ZONE |
Asia/Almaty |
Нет | Часовой пояс. |
POSTGRES_DB |
django_db |
Нет | Имя БД (только для Docker). |
POSTGRES_USER |
django_user |
Нет | Пользователь БД (только для Docker). |
POSTGRES_PASSWORD |
django_pass |
Нет | Пароль БД (только для Docker). |
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"Вставь результат в .env:
SECRET_KEY=полученная-строкаНикакой настройки не нужно. После python manage.py migrate в корне проекта создастся файл db.sqlite3. Подходит для локальной разработки.
Достаточно одной строки в .env:
DATABASE_URL=postgres://user:password@localhost:5432/dbnameПосле этого запусти миграции:
python manage.py migrateНикаких правок кода не требуется — переключение полностью через переменную окружения.
Проект поставляется с готовым Dockerfile и docker-compose.yml.
cp .env.example .env
docker compose up --buildЧто происходит при запуске:
- Собирается образ Django-приложения на базе
python:3.12-slim. - Поднимается контейнер PostgreSQL 17 с проверкой готовности (healthcheck).
- После того как БД готова — автоматически накатываются миграции.
- Запускается
runserverна порту8000.
# Запуск в фоне
docker compose up -d --build
# Остановка
docker compose down
# Остановка с удалением данных БД
docker compose down -v
# Логи
docker compose logs -f web
# Выполнить команду внутри контейнера
docker compose exec web python manage.py createsuperuser
docker compose exec web python manage.py migrate
docker compose exec web python manage.py shelldocker build -t django-drf-starter .Аутентификация реализована через djoser + djangorestframework-simplejwt. Все запросы к защищённым эндпоинтам требуют заголовок Authorization: Bearer <access_token>.
python manage.py createsuperusercurl -X POST http://127.0.0.1:8000/api/auth/jwt/create/ \
-H "Content-Type: application/json" \
-d '{"username": "your_user", "password": "your_password"}'Ответ:
{
"access": "<access_token>",
"refresh": "<refresh_token>"
}- access — короткоживущий токен для запросов к API.
- refresh — долгоживущий токен для получения нового access-токена.
curl -X POST http://127.0.0.1:8000/api/auth/jwt/refresh/ \
-H "Content-Type: application/json" \
-d '{"refresh": "<refresh_token>"}'curl -X POST http://127.0.0.1:8000/api/auth/jwt/verify/ \
-H "Content-Type: application/json" \
-d '{"token": "<access_token>"}'curl http://127.0.0.1:8000/api/some-endpoint/ \
-H "Authorization: Bearer <access_token>"| Метод | URL | Описание |
|---|---|---|
POST |
/api/auth/users/ |
Регистрация нового пользователя |
GET |
/api/auth/users/me/ |
Данные текущего пользователя |
POST |
/api/auth/jwt/create/ |
Получить access + refresh токены |
POST |
/api/auth/jwt/refresh/ |
Обновить access-токен |
POST |
/api/auth/jwt/verify/ |
Проверить токен |
POST |
/api/auth/users/set_password/ |
Изменить пароль |
Swagger и ReDoc доступны сразу после запуска сервера — без дополнительной настройки.
| Интерфейс | URL |
|---|---|
| Swagger UI | http://127.0.0.1:8000/swagger/ |
| ReDoc | http://127.0.0.1:8000/redoc/ |
Swagger поддерживает авторизацию по JWT: нажми кнопку Authorize и введи токен в формате Bearer <access_token>.
Для создания нового Django-приложения используй скрипт create_app.py. Он работает одинаково на Linux, macOS и Windows.
python create_app.py <name>Пример:
python create_app.py blogСкрипт автоматически:
- Проверит, что имя — валидный Python-идентификатор в нижнем регистре (не зарезервированное слово).
- Проверит, что папка
apps/blog/ещё не существует — если существует, завершится без изменений. - Создаст приложение в
apps/blog/черезmanage.py startapp. - Исправит
nameвapps/blog/apps.pyс"blog"на"apps.blog". - Создаст заглушки
apps/blog/urls.pyиapps/blog/serializers.pyс примерами кода. - Добавит
"apps.blog"вINSTALLED_APPSвcore/settings.py.
После создания подключи маршруты приложения в core/urls.py:
from django.urls import include, path
urlpatterns = [
...
path("api/blog/", include("apps.blog.urls")),
]apps/blog/
├── migrations/
│ └── __init__.py
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── serializers.py # заглушка с примером ModelSerializer
├── tests.py
├── urls.py # заглушка с примером роута
└── views.py
my-project/
├── .github/
│ └── workflows/
│ └── ci.yml # GitHub Actions: lint → check → migrate → test
├── apps/ # Пользовательские Django-приложения
│ └── __init__.py
├── core/ # Конфигурация проекта
│ ├── __init__.py
│ ├── settings.py # Все настройки через django-environ из .env
│ ├── urls.py # Корневой роутер (admin, auth, swagger)
│ ├── asgi.py # ASGI-точка входа
│ └── wsgi.py # WSGI-точка входа
├── tests/
│ └── test_smoke.py # Smoke-тесты: swagger, redoc, jwt, admin
├── .dockerignore # Исключения для Docker-сборки
├── .env.example # Шаблон переменных окружения
├── .gitignore
├── create_app.py # Скрипт создания нового приложения
├── docker-compose.yml # Django + PostgreSQL через Docker
├── Dockerfile # Образ приложения на python:3.12-slim
├── manage.py
├── pyproject.toml # Конфиг ruff и pytest
├── requirements.txt # Prod-зависимости
├── requirements-dev.txt # Dev-зависимости (ruff, pytest, pytest-django)
├── LICENSE
└── README.md
pip install -r requirements-dev.txtpytestruff check .ruff check --fix .python manage.py checkПри каждом push и pull_request в ветку main автоматически выполняется:
- Установка зависимостей из
requirements-dev.txt. ruff check .— проверка стиля кода.python manage.py check— проверка конфигурации Django.python manage.py migrate— применение миграций.pytest— запуск тестов.
CI работает на SQLite без внешних сервисов — зелёный сразу после клонирования.
Перед деплоем на продакшн-сервер обязательно:
- Сгенерируй новый
SECRET_KEYи задай его в.env. - Выставь
DEBUG=False— иначе Django отдаёт отладочные страницы с деталями ошибок. - Укажи реальный домен в
ALLOWED_HOSTS, например:ALLOWED_HOSTS=example.com,www.example.com. - Переключись на PostgreSQL через
DATABASE_URL. - Собери статику:
python manage.py collectstatic --noinput- Настрой раздачу статики и медиа через Nginx или облачное хранилище (S3 и т.п.) —
runserverне подходит для продакшна. - Используй Gunicorn или uWSGI вместо
runserver:
pip install gunicorn
gunicorn core.wsgi:application --bind 0.0.0.0:8000 --workers 4