使用一个django项目,我有3个不同的TLD。为了帮助处理多个域,我使用了django-hosts。就网站的内容和功能而言,有一个工作人员网站(staff.com)被发布者专门用于发布和管理内容,尽管它更加友好,但基本上类似于管理网站。然后有2个不同的客户网站,例如musicstuff.com和videotuff.com。这两个共享了两个应用程序,例如博客,论坛,内容页面等。由于所有3个站点都使用不同的域,因此我必须找到一种处理会话的方法。它需要一个登录页面,并且能够在所有站点及其各自的子域之间共享cookie。我有以下自定义中间件:
from django.conf import settings
class CrossDomainSessionMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
if response.cookies:
host = request.get_host()
if host not in settings.SESSION_COOKIE_DOMAIN:
if host in settings.ALLOWED_HOSTS:
domain = '{domain}'.format(domain=host)
for cookie in response.cookies:
if 'domain' in response.cookies[cookie]:
response.cookies[cookie]['domain'] = domain
return response
目标是将Cookie中的域替换为所使用网站中的域,该域必须在设置的ALLOWED_HOSTS中列出。
现在,这是其中的一个怪异部分:我开始研究网站的结构,并将用户和会话留给以后使用。最初,在实现该自定义中间件之前,我遇到的问题是django messages
仅在人员站点上显示,而在内容站点上却没有显示。消息似乎依赖于设置在工作人员网站上的SESSION_COOKIE_DOMAIN。实施自定义中间件后,消息也开始出现在内容站点上。我以为这也可以解决跨域身份验证问题,但事实并非如此。那么,为什么使用此替代方法而不是通过身份验证就能使邮件起作用?