Невозможно использовать сеансы при работе с несколькими базами данных. - PullRequest
1 голос
/ 28 сентября 2019

Кажется невозможным использовать сессии в моей конфигурации нескольких баз данных.Например, мне всегда нужно вводить имя пользователя и пароль при входе на сайт администратора.Как заставить сеансы работать?

У меня есть две базы данных, по одной для каждого языка:

# 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
...