多数据库配置下Django Session无法使用问题求助
解决多语言多数据库配置下Session失效的问题
看起来你遇到的核心问题是:数据库路由把Session、Auth这类核心模型的读写也导向了当前语言对应的数据库,导致每次请求(甚至同语言请求)可能因为找不到之前存在另一个库的Session记录,而反复要求登录。下面是具体的修复步骤:
1. 配置有效的默认数据库
你的default数据库目前是空的,我们需要让Django的核心应用(Session、Auth、Admin等)的数据统一存在这里。修改settings.py的DATABASES配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'db_default.sqlite3', # 新增默认数据库文件 }, 'ru': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'db_ru.sqlite3', }, 'en': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'db_en.sqlite3', } }
2. 修改数据库路由,隔离核心应用与业务数据
当前路由会把所有模型都导向语言对应的数据库,但Session、Auth这些需要全局共享的模型必须固定在默认库。更新database_routing.py里的DatabaseRouter类:
class DatabaseRouter(object): # 定义需要使用默认库的核心应用 CORE_APPS = {'sessions', 'auth', 'contenttypes', 'admin', 'messages'} 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): # 核心应用模型固定读默认库 if model._meta.app_label in self.CORE_APPS: return 'default' return self._default_db() def db_for_write(self, model, **hints): # 核心应用模型固定写默认库 if model._meta.app_label in self.CORE_APPS: return 'default' 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): # 核心应用只在默认库迁移,其他应用仅在语言库迁移 if app_label in self.CORE_APPS: return db == 'default' return db in ('ru', 'en')
3. 调整中间件顺序,确保语言识别正确
你的中间件顺序存在潜在问题:RouterMiddleware在SessionMiddleware和LocaleMiddleware之前,这时候request.LANGUAGE_CODE还没经过LocaleMiddleware处理(LocaleMiddleware依赖Session获取用户语言偏好),可能导致路由到错误的数据库。建议调整顺序:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'me.middleware.database_routing.RouterMiddleware', # 移到LocaleMiddleware之后 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
4. 重新迁移数据库
最后,需要把核心应用的表迁移到默认库,业务模型迁移到对应语言库:
# 迁移核心应用到默认库 python manage.py migrate --database=default # 迁移业务应用到俄语库 python manage.py migrate --database=ru # 迁移业务应用到英语库 python manage.py migrate --database=en
做完这些操作后,Session和Auth数据会统一存放在默认数据库中,不管切换到哪种语言,都能读取到正确的Session记录,就不会再出现反复要求登录的问题了。
内容的提问来源于stack exchange,提问作者Pavel Shlepnev
相关产品推荐
相关产品推荐

