django ImproperlyConfigured: параметр SECRET_KEY не должен быть пустым после разбиения settings.py - PullRequest
1 голос
/ 30 января 2020

Я знаю, что есть много этих вопросов ... но я просмотрел их и, похоже, не могу найти ничего подходящего для этой ситуации ... Итак, здесь я go

I решил разбить мои settings.py на 3 файла и переместить их в папку settings, и тогда все перестало работать

  • base.py
  • production.py
  • development.py

Вот структура каталогов (все это находится в основной папке 'project', давайте предположим, что она пока называется "myproject")

myproject
...
├── pages
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── myproject
│   ├── __init__.py
│   ├── adapter.py
│   ├── base.py
│   ├── celery.py
│   ├── settings
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── development.py
│   │   └── production.py
│   ├── urls.py
│   └── wsgi.py
...

давайте начнем с моего wsgi.py файла

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.production')

application = get_wsgi_application()

и теперь base.py

import os
import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

INSTALLED_APPS = [

    'pages.apps.PagesConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',

    'allauth',
    'allauth.account',
    'allauth.socialaccount',

    'crispy_forms',

    'anymail',

    'storages',

    'django_extensions',

    'cacheops',
    'django_celery_beat',
    'django_celery_results',

    'django_cleanup.apps.CleanupConfig',

    'albums.apps.AlbumsConfig',
    'user_profile.apps.UserProfileConfig',
    'votes.apps.VotesConfig',
    'myproject.templatetags',
    'participation.apps.ParticipationConfig',
    'siteinformation.apps.SiteinformationConfig',

]

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',
    'django.contrib.sites.middleware.CurrentSiteMiddleware',

]


ROOT_URLCONF = 'myproject.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],

            'libraries': {
                'include_svg': 'myproject.templatetags.include_svg',
            }
        },
    },
]

SITE_ID = 1

WSGI_APPLICATION = 'myproject.wsgi.application'



SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'session'


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',
    },
]

AUTHENTICATION_BACKENDS = (

    # Needed to login by username in Django admin, regardless of `allauth`
    'django.contrib.auth.backends.ModelBackend',

    # `allauth` specific authentication methods, such as login by e-mail
    'allauth.account.auth_backends.AuthenticationBackend',

)


LANGUAGE_CODE = 'en-us'

USE_I18N = True

USE_L10N = True

USE_TZ = False


STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'myproject/static')
]
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

# Media Folder Settings
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

# Messages
from django.contrib.messages import constants as messages

MESSAGE_TAGS = {
    messages.ERROR: 'danger'
}

# Crispy Forms Settings
CRISPY_TEMPLATE_PACK = 'bootstrap4'

INTERNAL_IPS = ['127.0.0.1']

и, наконец, производства .py

from myproject.settings.base import *

SECRET_KEY = 'somethinghere'
ALLOWED_HOSTS = ['xxx.xxx.xxx.xxx']

INSTALLED_APPS = [
                 ] + INSTALLED_APPS

MIDDLEWARE = [
                 'django.middleware.gzip.GZipMiddleware',
             ] + MIDDLEWARE

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'xxxxx',
        'USER': 'xxxxx',
        'PASSWORD': 'xxxxx',
        "HOST": 'xxx.xxx.xxx.xxx',
        'CONN_MAX_AGE': 60,
        'PORT': '5432',
        'OPTIONS': {
            'connect_timeout': 5,
            'options': '-c statement_timeout=50000',
        }
    },
}

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://xxx.xxx.xxx.xxx:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "SERIALIZER": "django_redis.serializers.msgpack.MSGPackSerializer",
            "SOCKET_CONNECT_TIMEOUT": 5,  # in seconds
            "SOCKET_TIMEOUT": 5,  # in seconds
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
        }
    },
    "session": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://xxx.xxx.xxx.xxx:6379/3",
        "TIMEOUT": 1440,
        "MAX_ENTRIES": 5,
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "SERIALIZER": "django_redis.serializers.msgpack.MSGPackSerializer",
            "SOCKET_CONNECT_TIMEOUT": 5,  # in seconds
            "SOCKET_TIMEOUT": 5,  # in seconds
            # "SERIALIZER": "django_redis.serializers.json.JSONSerializer",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},

        }
    }
}

# Celery config stuff goes here
CELERY_TASK_ALWAYS_EAGER = False
CELERY_BROKER_URL = 'redis://xxx.xxx.xxx.xxx:6379/5'
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SOFT_TIME_LIMIT = 60
DJANGO_CELERY_BEAT_TZ_AWARE = False

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt': "%d/%b/%Y %H:%M:%S"
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        # 'file': {
        #     'level': 'INFO',
        #     'class': 'logging.handlers.TimedRotatingFileHandler',
        #     'when': 'midnight',
        #     'filename': 'debug.log',
        #     'formatter': 'verbose',
        #
        # },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            # 'formatter': 'verbose',
            'stream': sys.stderr, },

    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': True,
        },
        'django.db.backends': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
        #        'django_redis.cache': {
        #            'level': 'DEBUG',
        #            'handlers': ['file', 'console'],
        #        }

    },

}

CACHEOPS_REDIS = "redis://xxx.xxx.xxx.xxx:6379/4"
CACHEOPS_DEFAULTS = {
     'timeout': 60
}
CACHEOPS = {
    'auth.user': {'ops': 'get', 'timeout': 60},
    'auth.*': {'ops': ('fetch', 'get')},
    'auth.permission': {'ops': 'all'},
}

Я пытался переместить SECRET_KEY в base.py, но не повезло, что заставляет меня задуматься, не звоню ли я даже в правильный файл настроек ....

если я запускаю python manage.py print_settings в своей оболочке pipenv, я вижу, что SECRET_KEY печатает (я обновил свой файл manage.py, добавив os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.production'))

Я догадываюсь, что некоторые что-то не так с тем, чтобы заставить gunicorn видеть правильную обстановку, но, возможно, я на неправильном пути.

но просто для удовольствия, вот файл gunicorn.service

[Unit]
Description=gunicorn myproject daemon
Requires=gunicorn.myproject.socket
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/var/www/myproject.com/myproject
ExecStart=/var/www/myproject.com/myproject/.venv/bin/gunicorn \
          --access-logfile /var/www/myproject.com/myproject/gunicorn-access.log \
          --error-logfile /var/www/myproject.com/myproject/gunicorn-error.log \
          --workers 5 \
          --bind unix:/run/gunicorn.myproject.sock \
          myproject.wsgi:application


[Install]
WantedBy=multi-user.target 

Что мне делать дальше? Или какая дополнительная информация может помочь отследить проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...