Кажется невозможным использовать сессии в моей конфигурации нескольких баз данных.Например, мне всегда нужно вводить имя пользователя и пароль при входе на сайт администратора.Как заставить сеансы работать?
У меня есть две базы данных, по одной для каждого языка:
# settings.py
DATABASES = {
'default': {},
'ru': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'db_ru.sqlite3',
},
'en': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'db_en.sqlite3',
}
}
Это промежуточный стек, который я использую:
# settings.py
MIDDLEWARE = [
'me.middleware.database_routing.RouterMiddleware',
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Я установил следующий маршрутизатор в settings.py
:
# settings.py
DATABASE_ROUTERS = ['me.middleware.database_routing.DatabaseRouter']
А вот код маршрутизатора:
# database_routing.py
import threading
from django.http import Http404
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin
request_cfg = threading.local()
class RouterMiddleware(MiddlewareMixin):
def process_view(self, request, view_func, view_args, view_kwargs):
lang = request.LANGUAGE_CODE
if any(lang == i[0] for i in settings.LANGUAGES):
request_cfg.lang = lang
else:
raise Http404()
def process_response(self, request, response):
if hasattr(request_cfg, 'lang'):
del request_cfg.lang
return response
class DatabaseRouter(object):
def _default_db(self):
if hasattr(request_cfg, 'lang') and request_cfg.lang in settings.DATABASES:
return request_cfg.lang
else:
return 'default'
def db_for_read(self, model, **hints):
return self._default_db()
def db_for_write(self, model, **hints):
return self._default_db()
def allow_relation(self, obj1, obj2, **hints):
db_list = ('default', 'ru', 'en')
if obj1._state.db in db_list and obj2._state.db in db_list:
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
return True