这个问题的两个答案,取决于共享是跨不同站点还是不同子域第二个答案:多个 Django 应用程序,共享身份验证
用户访问 site1.com 并登录。现在,如果他访问 site2.com,那么他应该已经在该站点登录(经过身份验证)。
site1.com 和 site2.com 由同一服务器上的不同 Django 应用程序处理。
我知道这些站点可以共享包含身份验证表的数据库。我不明白的是如何处理会话数据。用户登录到site1 后,转到site2。在这里,他总是有 request.user = "AnonymousUser: AnonymousUser" 而不是 user_id。
我在这里设置它:https://docs.djangoproject.com/en/dev/topics/db/multi-db/:
site1 的设置有一个包含身份验证模型以及其他一些数据表的数据库。site2 的设置有 2 个数据库。一个有自己的数据表,也是 user1 使用的一个。我基本上复制了类 AuthRouter 并设置了数据库路由器。
我想做的事不可能吗?我实际上并不了解这两个站点如何共享会话数据。我需要 Django 之外的东西吗?或者这应该工作吗?我可以在这里包含我的代码,但如果我对此的基本想法是错误的,我不想混淆这个问题。
编辑:这是我的设置。我正在本地主机上尝试这个。
Site1 在 localhost:8080 上运行
site2 在 localhost:8000 上运行
SITE2 应用程序:
db_router.py:
class AuthRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'auth':
return 'the_ui'
return None
# same for write
def allow_syncdb(self, db, model):
if db == 'the_ui':
return model._meta.app_label == 'auth'
elif model._meta.app_label == 'auth':
return False
return None
class OtherRouter(object):
def db_for_read(self, model, **hints):
return "default"
# same for write, relation, syncdb
设置.py:
DATABASE_ROUTERS = ['site2_app.db_router.AuthRouter', 'site2_app.db_router.OtherRouter']
SESSION_COOKIE_DOMAIN = 'http://localhost:8080'
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
DATABASES = {
'default': {
# ...
},
'the_ui': {
# ...
}
}
站点 1 应用程序:
# no router
# only single database, same as the "the_ui" used in site2
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"