Я знаю, что есть много этих вопросов ... но я просмотрел их и, похоже, не могу найти ничего подходящего для этой ситуации ... Итак, здесь я 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
Что мне делать дальше? Или какая дополнительная информация может помочь отследить проблему?