diff --git a/.env.sample b/.env.sample index 7de66ec..9515621 100644 --- a/.env.sample +++ b/.env.sample @@ -1,5 +1,6 @@ # Django Configuration Example -# Копируйте этот файл в .env.local и заполните реальные значения +# Все настройки читаются из переменных окружения (DEV/PROD без распознавания хоста) +# Для локальной разработки можно скопировать файл в .env.local и экспортировать его. # ============================================================================ # DJANGO @@ -15,19 +16,29 @@ DEBUG=False # Допустимые хосты (разделены запятой без пробелов) ALLOWED_HOSTS=localhost,127.0.0.1,yourdomain.com +# Админы для email-оповещений Django (формат: Имя:email,Имя2:email2) +ADMINS=Admin:admin@example.com + # ============================================================================ # DATABASE # ============================================================================ -# Database backend (по умолчанию mysql) -DATABASE_ENGINE=django.db.backends.mysql +# Database backend (по умолчанию SQLite) +DATABASE_ENGINE=django.db.backends.sqlite3 -# Database connection -DATABASE_HOST=localhost -DATABASE_PORT=3306 -DATABASE_NAME=django_oknardia -DATABASE_USER=web -DATABASE_PASSWORD=your-db-password-here +# Имя/путь базы данных: +# - для SQLite: только имя файла (полный путь соберется в settings.py через PROJECT_ROOT/database) +# - для MySQL/MariaDB: имя базы +DATABASE_NAME=oknadria.sqlite3 + +# Для MySQL/MariaDB (используются, если DATABASE_ENGINE=django.db.backends.mysql) +# DATABASE_HOST=localhost +# DATABASE_PORT=3306 +# DATABASE_USER=name-for-db-user +# DATABASE_PASSWORD=your-db-password-here + +# Пути вычисляются автоматически внутри settings.py от PROJECT_ROOT +TOUCH_RELOAD=/app/logs/touch-reload.txt # ============================================================================ # EMAIL @@ -40,6 +51,7 @@ EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend EMAIL_HOST=smtp.example.com EMAIL_PORT=587 EMAIL_USE_TLS=True +EMAIL_USE_SSL=False EMAIL_HOST_USER=your-email@example.com EMAIL_HOST_PASSWORD=your-email-password @@ -100,7 +112,7 @@ LOG_LEVEL=INFO # ============================================================================ # 1. Скопируйте этот файл: -# cp .env.example .env.local +# cp .env.sample .env.local # # 2. Отредактируйте значения в .env.local: # nano .env.local @@ -108,9 +120,8 @@ LOG_LEVEL=INFO # 3. Убедитесь, что .env.local в .gitignore: # grep ".env" .gitignore # -# 4. Используйте python-dotenv для загрузки переменных в settings.py: -# from dotenv import load_dotenv -# load_dotenv() +# 4. Экспортируйте переменные перед запуском Django: +# set -a; source .env.local; set +a # # ВАЖНО: # - НИКОГДА не коммитьте .env.local или файлы с реальными значениями в git! diff --git a/oknardia/oknardia/my_secret__sample.py b/oknardia/oknardia/my_secret__sample.py deleted file mode 100644 index 46b5fcb..0000000 --- a/oknardia/oknardia/my_secret__sample.py +++ /dev/null @@ -1,185 +0,0 @@ -# -*- coding: utf-8 -*- -""" -ШАБЛОН для my_secret.py - -ИНСТРУКЦИЯ: скопируйте этот файл в my_secret.py и заполните реальные значения. - -Пример: - cp oknardia/oknardia/my_secret__sample.py oknardia/oknardia/my_secret.py - # затем отредактируйте значения в my_secret.py - -ВАЖНО: my_secret.py НИКОГДА не должен быть в git! -Используйте .gitignore для исключения файла. -""" - -# ============================================================================ -# РАЗРАБОТКА (DEV) - Хосты и сетевые настройки -# ============================================================================ - -# Хосты на которых может работать приложение (разработка) -MY_ALLOWED_HOSTS = [ - '127.0.0.1', - 'localhost', - 'your-dev-hostname.local', # ИЗМЕНИТЕ на ваше имя хоста -] - -# Допустимые хосты для разработки -MY_HOST_HOME1 = 'your-dev-hostname-windows' # ИЗМЕНИТЕ -MY_HOST_HOME2 = 'your-dev-hostname-mac' # ИЗМЕНИТЕ -MY_HOST_DEV = [MY_HOST_HOME1, MY_HOST_HOME2] - -# Хосты для продакшена (заполнять с осторожностью) -MY_HOST_PROD = [] # На продакшене используйте переменные окружения! - -# ============================================================================ -# БЕЗОПАСНОСТЬ - Django SECRET_KEY -# ============================================================================ - -# SECURITY WARNING: keep the secret key used in production secret! -# Сгенерируйте новый ключ с помощью: -# python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())' -MY_SECRET_KEY = 'ЗАПОЛНИТЕ_СЛУЧАЙНОЙ_СТРОКОЙ_БОЛЬШОЙ_ДЛИНЫ' - -# ============================================================================ -# АДМИНИСТРАТОРЫ - для оповещений об ошибках -# ============================================================================ - -MY_ADMINS = ( - ('Your Name', 'your-email@example.com'), - ('Admin Name', 'admin@example.com'), -) - -# ============================================================================ -# ПУТИ К ФАЙЛАМ - разработка -# ============================================================================ - -# путь к каталогу media (статика, для web-сервера nginx или apache) -MY_MEDIA_ROOT_DEV1 = 'M:\\path\\to\\your\\media\\' # Windows (если применимо) -MY_MEDIA_ROOT_DEV2 = '/path/to/your/media/' # Mac/Linux - ИЗМЕНИТЕ! - -# путь к каталогу static (статика, для web-сервера nginx или apache) -MY_STATIC_ROOT_DEV1 = 'M:\\path\\to\\your\\static' # Windows (если применимо) -MY_STATIC_ROOT_DEV2 = '/path/to/your/static' # Mac/Linux - ИЗМЕНИТЕ! - -# путь для кэш-блоков шаблонов -MY_STATIC_BASE_PATH_DEV1 = MY_STATIC_ROOT_DEV1 -MY_STATIC_BASE_PATH_DEV2 = MY_STATIC_ROOT_DEV2 - -# путь для sitemap файлов -MY_SITEMAP_ROOT_DEV1 = 'M:\\path\\to\\your\\public\\' # Windows (если применимо) -MY_SITEMAP_ROOT_DEV2 = '/path/to/your/public/' # Mac/Linux - ИЗМЕНИТЕ! - -# ============================================================================ -# ПУТИ К ФАЙЛАМ - продакшен -# ============================================================================ - -MY_MEDIA_ROOT_PROD = '/home/web/oknardia-ru/public/media/' # ЗАПОЛНИТЕ! -MY_STATIC_ROOT_PROD = '/home/web/oknardia-ru/public/static' # ЗАПОЛНИТЕ! -MY_STATIC_BASE_PATH_PROD = MY_STATIC_ROOT_PROD -MY_SITEMAP_ROOT_PROD = '/home/web/oknardia-ru/public/' # ЗАПОЛНИТЕ! - -# ============================================================================ -# EMAIL - Почтовый сервер (разработка) -# ============================================================================ - -# Email адреса для разработки -MY_EMAIL_DEV = 'dev-email@example.com' -MY_EMAIL_FROM_DEV = 'dev-email@example.com' -MY_EMAIL_HOST_USER_DEV = 'your-email@smtp.example.com' # ЗАПОЛНИТЕ! -MY_EMAIL_HOST_PASSWORD_DEV = 'YOUR_EMAIL_PASSWORD' # ЗАПОЛНИТЕ! -MY_EMAIL_HOST_DEV = 'smtp.example.com' # ЗАПОЛНИТЕ! (например: smtp.mail.ru) -MY_EMAIL_PORT_DEV = 587 # ЗАПОЛНИТЕ! (обычно 587 или 2525) - -# ============================================================================ -# EMAIL - Почтовый сервер (продакшен) -# ============================================================================ - -MY_EMAIL_PROD = MY_EMAIL_DEV -MY_EMAIL_FROM_PROD = MY_EMAIL_FROM_DEV -MY_EMAIL_HOST_USER_PROD = MY_EMAIL_HOST_USER_DEV # На продакшене используйте env переменные! -MY_EMAIL_HOST_PASSWORD_PROD = MY_EMAIL_HOST_PASSWORD_DEV # На продакшене используйте env переменные! -MY_EMAIL_HOST_PROD = MY_EMAIL_HOST_DEV -MY_EMAIL_PORT_PROD = MY_EMAIL_PORT_DEV - -# ============================================================================ -# БД MySQL/MariaDB - разработка -# ============================================================================ - -MY_DATABASE_HOST_DEV1 = 'localhost' # Офисный сервер разработки - ИЗМЕНИТЕ! -MY_DATABASE_HOST_DEV2 = 'localhost' # Домашний сервер разработки - ИЗМЕНИТЕ! - -MY_DATABASE_NAME_DEV = 'django_oknardia_dev' # ИЗМЕНИТЕ если нужно -MY_DATABASE_PORT_DEV = '3306' # Стандартный порт MySQL - -MY_DATABASE_USER_DEV = 'web' # ИЗМЕНИТЕ если нужно -MY_DATABASE_PASSWORD_DEV = 'YOUR_DB_PASSWORD' # ЗАПОЛНИТЕ! - -# ============================================================================ -# БД MySQL/MariaDB - продакшен -# ============================================================================ - -MY_DATABASE_HOST_PROD = 'localhost' # ЗАПОЛНИТЕ! (на продакшене) -MY_DATABASE_NAME_PROD = 'django_oknardia_prod' # ЗАПОЛНИТЕ! - -MY_DATABASE_PORT_PROD = '3306' -MY_DATABASE_USER_PROD = 'web' - -# ВНИМАНИЕ: На продакшене используйте переменные окружения или менеджер секретов! -MY_DATABASE_PASSWORD_PROD = '' # ОСТАВЬТЕ ПУСТО! Используйте переменные окружения! - -# ============================================================================ -# API ключи - Google Captcha -# ============================================================================ - -# Получите ключи на https://www.google.com/recaptcha/admin -# ВАЖНО: Никогда не коммитьте реальные ключи в git! -# PRIVATE ключ - это СЕКРЕТ, держите его в безопасности! -MY_CAPTCHA_PUBLIC_KEY = 'YOUR_CAPTCHA_PUBLIC_KEY_HERE' # ЗАПОЛНИТЕ! -MY_CAPTCHA_PRIVATE_KEY = 'YOUR_CAPTCHA_PRIVATE_KEY_HERE' # ЗАПОЛНИТЕ! (СЕКРЕТ!) - -# ============================================================================ -# API ключи - Yandex Maps -# ============================================================================ - -# Получите ключ на https://developer.tech.yandex.ru/ -MY_YANDEX_MAPS_API_KEY = 'YOUR_YANDEX_MAPS_API_KEY' - -# ============================================================================ -# uWSGI - Touch-reload файл (для перезагрузки при изменении кода) -# ============================================================================ - -MY_TOUCH_RELOAD_DEV1 = 'M:\\path\\to\\touch-reload.txt' # Windows (если применимо) -MY_TOUCH_RELOAD_DEV2 = '/path/to/logs/touch-reload.txt' # Mac/Linux - ИЗМЕНИТЕ! -MY_TOUCH_RELOAD_PROD = '/home/web/oknardia-ru/logs/touch-reload.txt' # ЗАПОЛНИТЕ! - -# ============================================================================ -# ИНСТРУКЦИЯ ПО ЗАПОЛНЕНИЮ -# ============================================================================ - -""" -1. СКОПИРУЙТЕ этот файл: - cp oknardia/oknardia/my_secret.py.template oknardia/oknardia/my_secret.py - -2. ОТРЕДАКТИРУЙТЕ значения, помеченные ИЗМЕНИТЕ! или ЗАПОЛНИТЕ! - -3. УБЕДИТЕСЬ, что мой_secret.py в .gitignore: - grep my_secret .gitignore - -4. НИКОГДА не коммитьте my_secret.py в git! - -5. На ПРОДАКШЕНЕ используйте переменные окружения: - export DJANGO_SECRET_KEY="..." - export DATABASE_PASSWORD="..." - и т.д. - -СОВЕТЫ: -- Сгенерируйте новый SECRET_KEY с помощью Python: - python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())' - -- Используйте менеджер паролей (LastPass, 1Password, Vault) для хранения учетных данных - -- Регулярно меняйте пароли БД и API ключи - -- На продакшене используйте отдельные более сильные пароли -""" - diff --git a/oknardia/oknardia/settings.py b/oknardia/oknardia/settings.py index f8d8ea0..ef6b12e 100644 --- a/oknardia/oknardia/settings.py +++ b/oknardia/oknardia/settings.py @@ -11,42 +11,50 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/4.1/ref/settings/ """ -import os from pathlib import Path -from oknardia.my_secret import * -import socket +import environ + + +def _env_admins(raw_items: list[str]) -> tuple[tuple[str, str], ...]: + # Формат: "Имя1:email1,Имя2:email2" + admins: list[tuple[str, str]] = [] + for item in raw_items: + if ":" not in item: + continue + admin_name, admin_email = item.split(":", maxsplit=1) + admin_name = admin_name.strip() + admin_email = admin_email.strip() + if admin_name and admin_email: + admins.append((admin_name, admin_email)) + return tuple(admins) # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent - -# Переключатель БД для DEV: по умолчанию используем SQLite. -# Чтобы вернуть MariaDB на DEV, установите OKNARDIA_USE_SQLITE_DEV=0 -USE_SQLITE_DEV = os.getenv("OKNARDIA_USE_SQLITE_DEV", "1").strip().lower() in { - "1", "true", "yes", "on" -} PROJECT_ROOT = BASE_DIR.parent -SQLITE_DB_PATH = PROJECT_ROOT / 'database' / 'oknadria.sqlite3' +PUBLIC_ROOT = PROJECT_ROOT / 'public' +STATIC_SOURCE_ROOT = PUBLIC_ROOT / 'static' + +env = environ.Env() +environ.Env.read_env(str(PROJECT_ROOT / '.env')) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-pd&1$j6z*1w#(j*16b+(@@#&2)+@x^^ot4)zqt-e67*1+$^qch' +SECRET_KEY = env( + 'DJANGO_SECRET_KEY', + default='django-insecure-pd&1$j6z*1w#(j*16b+(@@#&2)+@x^^ot4)zqt-e67*1+$^qch', +) # SECURITY WARNING: don't run with debug turned on in production! # ПРЕДУПРЕЖДЕНИЕ БЕЗОПАСНОСТИ: не работайте в режиме DEBUG в продашене! -if socket.gethostname() in MY_HOST_DEV: - DEBUG = TEMPLATE_DEBUG = True -else: - # Все остальные хосты (подразумевается продакшн) - # DEBUG = TEMPLATE_DEBUG = True - DEBUG = TEMPLATE_DEBUG = False +DEBUG = TEMPLATE_DEBUG = env.bool('DEBUG', default=False) -ALLOWED_HOSTS = MY_ALLOWED_HOSTS +ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['127.0.0.1', 'localhost']) # Настройки сообщений об ошибках когда все упало и т.п. -ADMINS = MY_ADMINS +ADMINS = _env_admins(env.list('ADMINS', default=[])) # Application definition @@ -124,83 +132,68 @@ DATETIME_FORMAT = 'Y-m-d H:i:s' # Статические файлы (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.1/howto/static-files/ -STATIC_URL = 'static/' -MEDIA_URL = 'media/' +STATIC_URL = '/static/' +MEDIA_URL = '/media/' -if socket.gethostname() in MY_HOST_DEV: # DEBUG: заменяем настройки прода, на настройки девопа - MEDIA_ROOT = MY_MEDIA_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_MEDIA_ROOT_DEV2 - SITEMAP_ROOT = MY_SITEMAP_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_SITEMAP_ROOT_DEV2 - # STATIC_ROOT = MY_STATIC_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_ROOT_DEV2 - dev_static_from_secret = MY_STATIC_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_ROOT_DEV2 - # Если путь из секрета устарел, используем путь текущего репозитория. - dev_static_fallback = PROJECT_ROOT / 'public' / 'static' - dev_static_path = dev_static_from_secret if os.path.isdir(dev_static_from_secret) else str(dev_static_fallback) - STATICFILES_DIRS = [dev_static_path] - # путь к каталогу static (в эту переменную использовать для указания пути где будут делаться кэш-блоки для шаблонов) - dev_static_base_from_secret = MY_STATIC_BASE_PATH_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_BASE_PATH_DEV2 - STATIC_BASE_PATH = dev_static_base_from_secret if os.path.isdir(dev_static_base_from_secret) else str(dev_static_fallback) - if USE_SQLITE_DEV: - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': SQLITE_DB_PATH, - } - } - else: - DATABASES = { - 'default': { - 'ENGINE': "django.db.backends.mysql", - 'HOST': MY_DATABASE_HOST_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_DATABASE_HOST_DEV2, - 'PORT': MY_DATABASE_PORT_DEV, # Set to "" for default. Not used with sqlite3. - 'NAME': MY_DATABASE_NAME_DEV, # Not used with sqlite3. - 'USER': MY_DATABASE_USER_DEV, # Not used with sqlite3. - 'PASSWORD': MY_DATABASE_PASSWORD_DEV, # Not used with sqlite3. - # 'OPTIONS': { 'autocommit': True, } - } - } - TOUCH_RELOAD = MY_TOUCH_RELOAD_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_TOUCH_RELOAD_DEV2 -else: - MEDIA_ROOT = MY_MEDIA_ROOT_PROD - # STATICFILES_DIRS = [MY_STATIC_ROOT_PROD1, ] - STATIC_ROOT = MY_STATIC_ROOT_PROD - SITEMAP_ROOT = MY_SITEMAP_ROOT_PROD - # путь к каталогу static (в эту переменную использовать для указания пути где будут делаться кэш-блоки для шаблонов) - STATIC_BASE_PATH = MY_STATIC_BASE_PATH_PROD - DATABASES = { - 'default': { - 'ENGINE': "django.db.backends.mysql", - 'HOST': MY_DATABASE_HOST_PROD, # Set to "" for localhost. Not used with sqlite3. - 'PORT': MY_DATABASE_PORT_PROD, # Set to "" for default. Not used with sqlite3. - 'NAME': MY_DATABASE_NAME_PROD, # Not used with sqlite3. - 'USER': MY_DATABASE_USER_PROD, # Not used with sqlite3. - 'PASSWORD': MY_DATABASE_PASSWORD_PROD, # Not used with sqlite3. - # 'OPTIONS': { 'autocommit': True, } - } - } - TOUCH_RELOAD = MY_TOUCH_RELOAD_PROD +MEDIA_ROOT = str(PUBLIC_ROOT / 'media') +# STATIC_ROOT отделен от исходной статики, чтобы избежать staticfiles.E002. +STATIC_ROOT = str(PUBLIC_ROOT / 'static_collected') +SITEMAP_ROOT = str(PUBLIC_ROOT) -# Для локальной/тестовой разработки можно принудительно включить SQLite даже -# если hostname не попал в MY_HOST_DEV. На прод-хостах (MY_HOST_PROD) override -# не применяется. -if USE_SQLITE_DEV and socket.gethostname() not in MY_HOST_PROD: +# Каталоги, откуда Django читает исходную статику в DEBUG-режиме. +STATICFILES_DIRS = [ + str(STATIC_SOURCE_ROOT) +] if STATIC_SOURCE_ROOT.is_dir() else [] + +# Путь к каталогу static для генерации кэш-файлов и служебных JS. +STATIC_BASE_PATH = str(STATIC_SOURCE_ROOT) + +database_engine = env('DATABASE_ENGINE', default='django.db.backends.sqlite3') +if database_engine == 'django.db.backends.sqlite3': + # Для SQLite принимаем только имя файла из env и кладем БД в PROJECT_ROOT/database. + sqlite_db_filename = Path(env('DATABASE_NAME', default='oknadria.sqlite3')).name + sqlite_db_path = PROJECT_ROOT / 'database' / sqlite_db_filename DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': SQLITE_DB_PATH, + 'NAME': str(sqlite_db_path), + } + } +else: + DATABASES = { + 'default': { + 'ENGINE': database_engine, + 'HOST': env('DATABASE_HOST', default='localhost'), + 'PORT': env('DATABASE_PORT', default='3306'), + 'NAME': env('DATABASE_NAME', default=''), + 'USER': env('DATABASE_USER', default=''), + 'PASSWORD': env('DATABASE_PASSWORD', default=''), } } +TOUCH_RELOAD = env('TOUCH_RELOAD', default='') + ######################################### # настройки для почтового сервера (они одинаковые для DEV и PROD) -EMAIL_HOST = MY_EMAIL_HOST_DEV -EMAIL_PORT = MY_EMAIL_PORT_DEV -EMAIL_HOST_USER = MY_EMAIL_HOST_USER_DEV -EMAIL_HOST_PASSWORD = MY_EMAIL_HOST_PASSWORD_DEV -SERVER_EMAIL = DEFAULT_FROM_EMAIL = EMAIL_HOST_USER -EMAIL_USE_TLS = True +EMAIL_BACKEND = env( + 'EMAIL_BACKEND', + default='django.core.mail.backends.smtp.EmailBackend', +) +EMAIL_HOST = env('EMAIL_HOST', default='localhost') +EMAIL_PORT = env.int('EMAIL_PORT', default=25) +EMAIL_HOST_USER = env('EMAIL_HOST_USER', default='') +EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD', default='') +EMAIL_USE_TLS = env.bool('EMAIL_USE_TLS', default=True) +EMAIL_USE_SSL = env.bool('EMAIL_USE_SSL', default=False) +DEFAULT_FROM_EMAIL = env('DEFAULT_FROM_EMAIL', default=EMAIL_HOST_USER) +SERVER_EMAIL = env('SERVER_EMAIL', default=DEFAULT_FROM_EMAIL) EMAIL_SUBJECT_PREFIX = 'OKNARDIA ERR: ' # префикс для оповещений об ошибках и необработанных исключениях +SECURE_SSL_REDIRECT = env.bool('SECURE_SSL_REDIRECT', default=False) +SESSION_COOKIE_SECURE = env.bool('SESSION_COOKIE_SECURE', default=False) +CSRF_COOKIE_SECURE = env.bool('CSRF_COOKIE_SECURE', default=False) + # Default primary key field type # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field @@ -208,8 +201,8 @@ EMAIL_SUBJECT_PREFIX = 'OKNARDIA ERR: ' # префикс для оповещ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # ключи для Google Captha -CAPTCHA_PUBLIC_KEY = MY_CAPTCHA_PUBLIC_KEY -CAPTCHA_PRIVATE_KEY = MY_CAPTCHA_PRIVATE_KEY +CAPTCHA_PUBLIC_KEY = env('CAPTCHA_PUBLIC_KEY', default='') +CAPTCHA_PRIVATE_KEY = env('CAPTCHA_PRIVATE_KEY', default='') # количество коммерческих предложений во фреме отчета OFFER_PER_FRAME = 5 @@ -303,4 +296,4 @@ CATALOG_SORTER_MAGIC_NUMBER_TIZER = 1 MAX_LEN_RING_LOG_BUFFER = 250 # МАКСИМАЛЬНЫЙ РАЗМЕР КОЛЬЦЕВОГО БУФЕРА -YANDEX_MAPS_API_KEY = MY_YANDEX_MAPS_API_KEY +YANDEX_MAPS_API_KEY = env('YANDEX_MAPS_API_KEY', default='') diff --git a/requare_dev_mac.txt b/requare_dev_mac.txt index 5588ea1..d8ddf46 100644 --- a/requare_dev_mac.txt +++ b/requare_dev_mac.txt @@ -1,4 +1,5 @@ Django==4.1.5 +django-environ==0.11.2 asgiref==3.6.0 sqlparse==0.4.3 diff --git a/requare_prod.txt b/requare_prod.txt index 5588ea1..d8ddf46 100644 --- a/requare_prod.txt +++ b/requare_prod.txt @@ -1,4 +1,5 @@ Django==4.1.5 +django-environ==0.11.2 asgiref==3.6.0 sqlparse==0.4.3