Django на PythonAnywhere: Неправильная конфигурация: Параметр SECRET_KEY не должен быть пустым

Я размещаю проект Django на PythonAnywhere и сталкиваюсь со следующей ошибкой при запуске makemigrations: django.core.exceptions.ImproperlyConfigured: Параметр SECRET_KEY не должен быть пустым.

Моя установка:

Платформа хостинга: PythonAnywhere
Управление окружением: Использование файла .env для управления секретами
. Версия Python: 3.10
Версия Django: 5.1.2

В моем WSGI-файле я включил следующий код для загрузки .env-файла:

import sys
from dotenv import load_dotenv

path = '/home/verbsmerch/verbs_backend'
project_folder = os.path.expanduser(path)
load_dotenv(os.path.join(project_folder, '.env'))

В своих настройках я загружаю SECRET_KEY следующим образом:
SECRET_KEY = os.getenv("SECRET_KEY")

Что я пробовал:

  1. Убедитесь, что файл .env существует и находится в правильном каталоге.
  2. Проверили, что файл .env имеет правильные права доступа (chmod 600).
  3. Запустил оболочку Python для отладки:
from dotenv import load_dotenv
import os

load_dotenv('/home/verbsmerch/verbs_backend/.env')
print(os.getenv("SECRET_KEY"))  # This prints the correct key

  1. Перезагрузите веб-приложение с вкладки PythonAnywhere Web.

Почему Django не может загрузить SECRET_KEY, хотя в оболочке Python он вроде бы работает? Как я могу решить эту ошибку?

Не знаю, откуда взялась ваша конкретная ошибка, но я размещал веб-приложения на Pythonanywhere и использовал python-decouple для управления файлами .env. Пожалуйста, посмотрите Как использовать Python Decouple для установки и настройки переменных окружения.

Модуль Django settings содержит всю конфигурацию вашей установки Django. Как следствие, он загружается первым, и все «настройки» применяются до запуска WSGI-сервера.

В вашем случае SECRET_KEY = os.getenv("SECRET_KEY") запускается первым перед load_dotenv(os.path.join(project_folder, '.env')), потому что первый содержится в модуле settings, а второй - в модуле wsgi.

Вам придется пересмотреть установленное расположение load_dotenv(os.path.join(project_folder, '.env')), чтобы в итоге все получилось. Я бы предложил загружать переменные окружения из модуля settings, а затем использовать их сразу же в модуле settings и в любом другом месте после него.

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