Files
2026-etpgrf-site/etpgrf_site/etpgrf_site/settings.py

157 lines
5.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Django settings for etpgrf_site project.
"""
import os
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
# BASE_DIR указывает на папку, содержащую manage.py (etpgrf_site)
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.getenv('SECRET_KEY', 'django-insecure-s#inx+l(6ie0)zaq8v$)8fpube-6*=1w^q6^^3q5d6$gyf43+l')
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = os.getenv('DEBUG', 'True') == 'True'
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', 'localhost,127.0.0.1').split(',')
# CSRF Trusted Origins (важно для работы через Nginx/Docker)
CSRF_TRUSTED_ORIGINS = os.getenv('CSRF_TRUSTED_ORIGINS', 'http://localhost:8000,http://127.0.0.1:8000').split(',')
# URL админки (можно скрыть через .env)
# По умолчанию 'admin/'
ADMIN_URL = os.getenv('ADMIN_URL', 'admin/')
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sitemaps', # Sitemap
'typograph', # Основное приложение типографа
'blog', # Приложение для блога и страниц
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
# 'whitenoise.middleware.WhiteNoiseMiddleware', # Лишнее, так как в контейнере используем Nginx для статики
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'etpgrf_site.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [], # Шаблоны ищем внутри приложений (APP_DIRS=True)
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'etpgrf_site.wsgi.application'
# Database
# https://docs.djangoproject.com/en/6.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
# База данных лежит в папке data в корне проекта
'NAME': BASE_DIR.parent / 'data' / 'db-etpgrf.sqlite3',
'OPTIONS': {
# Таймаут ожидания блокировки SQLite (в секундах)
# При сложных операциях (например, каскадное удаление тегов) нужно больше времени
'timeout': 20,
},
}
}
# Password validation
# https://docs.djangoproject.com/en/6.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/6.0/topics/i18n/
LANGUAGE_CODE = 'ru-RU'
TIME_ZONE = 'Europe/Moscow'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/6.0/howto/static-files/
STATIC_URL = 'static/'
# Поднимаемся на уровень выше от manage.py, чтобы попасть в корень репозитория
# И кладем всё в папку public
STATIC_ROOT = BASE_DIR.parent / 'public' / 'static_collected'
STATICFILES_DIRS = [BASE_DIR.parent / 'public' / 'static']
# Убираем настройки WhiteNoise, так как в продакшене статику будет раздавать Nginx
# STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
# Медиа файлы (загружаемые пользователем)
MEDIA_ROOT = BASE_DIR.parent / 'media'
MEDIA_URL = '/media/'
# Default primary key field type
# https://docs.djangoproject.com/en/6.0/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# Настройки безопасности для работы за прокси
if not DEBUG:
# Если есть заголовок `X-Forwarded-Proto` со значением `https`, то считать запрос безопасным(HTTPS).
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# Если кто-то зайдет по HTTP, то перенаправить на HTTPS. Подключать, только если Nginx уже настроен на HTTPS.
SECURE_SSL_REDIRECT = True
# Устанавливает флаг Secure для куки сессии и CSRF, чтобы браузер отправлял их только по HTTPS.
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# Обрабатывать заголовки `X-Forwarded-Host` и `X-Forwarded-Port`, которые Nginx может добавлять при проксировании.
USE_X_FORWARDED_HOST = True
USE_X_FORWARDED_PORT = True