Сессия Django работает нормально локально, но после развертывания на Heroku она обновляется при каждом изменении представления
При локальной работе сессии отлично работают при смене представлений, но при развертывании на Heroku сессия как будто обновляется, и вся содержащаяся в ней информация удаляется при каждом изменении представления. Я использую базу данных Postgres от Heroku.
Я уже посмотрел: Django Session Not Working on Heroku, но проблема все еще сохраняется. У других людей такая же проблема, но четкого ответа нет.
Вот мой текущий файл настроек. Любая помощь будет оценена по достоинству
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = 'e488a0185303170daa47fe1de243823fbb3db60f045e6eae'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['127.0.0.1', 'here goes the heroku host']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'....',
'....',
]
ASGI_APPLICATION = 'System.asgi.application'
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'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',
]
ROOT_URLCONF = 'System.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [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',
],
},
},
]
WSGI_APPLICATION = 'System.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES['default'].update(db_from_env)
SESSION_ENGINE= 'django.contrib.sessions.backends.cached_db'
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {'min_length': 8}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'authentication.validators.NumericValidator',
},
{
'NAME': 'authentication.validators.UppercaseValidator',
},
{
'NAME': 'authentication.validators.LowercaseValidator',
},
]
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'America/New_York'
USE_I18N = True
USE_L10N = True
USE_TZ = False
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_ROOT = os.path.join(BASE_DIR, 'authentication/media/')
MEDIA_URL = '/authentication/media/'
Вы сохраняете сессии в базе данных, что является разумным выбором на Heroku, но вы используете SQLite в качестве базы данных.
Эфемерная файловая система Героку делает SQLite плохим выбором базы данных. Данные не будут обмениваться между дино и будут потеряны при каждом перезапуске вашего дино. Это происходит часто (по крайней мере, один раз в день).
Независимо от того, как вы решите работать с сессиями, вам следует перейти с SQLite на клиент-серверную базу данных, например PostgreSQL, если вы хотите продолжать использовать Heroku. Простое выполнение этой задачи, скорее всего, решит проблему с сессиями как побочный эффект.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': '...db name',
'USER': "postgres",
'PASSWORD': '...db password',
'HOST': 'localhost',
'PORT': '5432',
} }