⚖️ Старый vs Новый подход

⚡ Главные изменения — кратко

  • Секреты в коде (старое) → .env + django-environ (новое)
  • url() с regex (Django 1.x) → path() / re_path() (Django 2.x+)
  • decouple / python-dotenv → django-environ (более удобный Django-специфичный API)

1. Хранение секретов: из лекции (старое) → современное

Из лекции (старое) — небезопасно:
# config/settings.py — не делайте так!
SECRET_KEY = 'django-insecure-hardcoded-key-in-source-code'
DEBUG = True
ALLOWED_HOSTS = ['*']
Современный подход (Django 5.x + django-environ):
# .env
SECRET_KEY=django-insecure-very-secret-key
DEBUG=True
ALLOWED_HOSTS=127.0.0.1,localhost

# config/settings.py
from environ import Env
env = Env()
Env.read_env(BASE_DIR / '.env')
SECRET_KEY = env('SECRET_KEY')
DEBUG = env.bool('DEBUG', default=False)
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=[])

2. URL-маршрутизация: из лекции (старое) → современное

Из лекции (старое) — Django 1.x, устарело:
# urls.py — Django 1.x
from django.conf.urls import url

urlpatterns = [
    url(r'^first/$', views.first_view, name='first_view'),
    url(r'^admin/', admin.site.urls),
]
Современный подход (Django 2.x+, актуален в Django 5.x):
# urls.py — Django 5.x
from django.urls import path, re_path

urlpatterns = [
    path('first/', views.first_view, name='first_view'),
    path('admin/', admin.site.urls),
    # re_path используется только если нужны регулярные выражения:
    # re_path(r'^article/(?P<pk>\d+)/$', views.article_detail),
]

3. Регистрация приложения: из лекции (старое) → современное

Из лекции (упрощённый вариант):
INSTALLED_APPS = [
    ...
    'first_app',  # просто имя модуля
]
Рекомендуемый современный подход:
INSTALLED_APPS = [
    ...
    'first_app.apps.FirstAppConfig',  # явный класс конфигурации
]

Явная ссылка на AppConfig позволяет Django правильно инициализировать приложение, применять сигналы и задавать default_auto_field.

4. python-dotenv vs django-environ

Критерийpython-dotenvdjango-environ
ТипизацияТолько строкиenv.bool(), env.list(), env.db() и др.
Django-интеграцияРучнаяВстроенная
DATABASE_URLНетenv.db() → готовый dict для DATABASES
Популярность в DjangoСредняяВысокая