Django: ImproperlyConfigured: Параметр SECRET_KEY не должен быть пустым

Я видел другие сообщения об этом, например здесь, но я все еще не могу разобраться в своей проблеме.

Файловая структура соответствующих файлов:

ba_django_project
|  docker-compose.prod.yml
|
|__app
   |  Dockerfile.prod
   |  manage.py
   |  .env.prod
   |
   |__ba_django_project
      |  __init__.py
      |  settings.py
      |  wsgi.py

docker-compose.prod.yml:

version: '3.8'

services:
  web:
    build:
      context: ./app
      dockerfile: Dockerfile.prod
    image: 370950449536.dkr.ecr.us-east-2.amazonaws.com/ba_django_project:ba_django_project_web
    command: gunicorn ba_django_project.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - static_volume:/home/app/web/staticfiles
      - media_volume:/home/app/web/mediafiles
    expose:
      - 8000
    env_file:
      - ./app/.env.prod
    depends_on:
      - db
  db:
    image: postgres:13.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file:
      - ./app/.env.prod.db
  nginx:
    build: ./nginx
    image: 370950449536.dkr.ecr.us-east-2.amazonaws.com/ba_django_project:ba_django_project_nginx
    volumes:
      - static_volume:/home/app/web/staticfiles
      - media_volume:/home/app/web/mediafiles
    ports:
      - 1337:80
    depends_on:
      - web

volumes:
  postgres_data:
  static_volume:
  media_volume:

settings.py:

from pathlib import Path
from decouple import config
import os


# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
STATIC_DIR = os.path.join(BASE_DIR, "static")


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('SECRET_KEY')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = int(os.environ.get("DEBUG", default=0))

ALLOWED_HOSTS = [
    'ec2-3-20-22-254.us-east-2.compute.amazonaws.com', '0.0.0.0', 'localhost', '127.0.0.1'
]


# Application definition

INSTALLED_APPS = [
    'crispy_forms',
    'users.apps.UsersConfig',
    'resume.apps.ResumeConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    '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',
]

# etc. can post full version if needed

.env.prod:

SECRET_KEY='secretkeyfiller'

manage.py:

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ba_django_project.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ba_django_project.settings')

application = get_wsgi_application()

Я не получал эту ошибку до того, как начал пытаться заставить приложение работать на сервере. Похоже, что единственное возможное решение - это либо я что-то напутал с DJANGO_SETTINGS_MODULE, либо есть какая-то круговая зависимость, которую я не могу найти. Я просмотрел все свои файлы, пытаясь найти файлы, импортирующие настройки, и убрал их ссылки на настройки, но все равно ничего не получается.

Вы, должно быть, напутали с вашим SECRET_KEY, когда пытались защитить его с помощью .env. У вас должен быть настоящий секретный ключ. Например: SECRET_KEY=QhJgFHhvNJFFHjFfdH.... в файле .env. Если у вас его нет, есть способы сгенерировать его, используя это руководство

ПРИМЕЧАНИЕ: нет кавычек вокруг секретного ключа в файле .env.

Хотя я мог бы поклясться, что дважды проверил это, когда я отправил свой .env файл на сервер, специальные символы в секретном ключе заставили его пропустить эту строку. Это может помочь при вводе специальных символов с помощью sed.

Если проблема не в этом, я также убрал кавычки вокруг секретного ключа.

Вернуться на верх