Django2:如何共享';请求。用户';使用localhost:8000和子域分析。localhost:8000?

Django2:如何共享';请求。用户';使用localhost:8000和子域分析。localhost:8000?,django,python-3.x,django-hosts,Django,Python 3.x,Django Hosts,我正在使用Django建立一个博客,我已经实现了一个分析工具,可以让我绘制关于访问者的详细信息(来源国、设备、浏览器等) 分析。localhost:8000是localhost的子域,定义为基于类的视图,具有自定义的MixinSuperuserAccessRequired,如果用户不是员工,则返回401个未经授权的(我正在使用django主机处理子域&这是我第一次使用子域。) 我的问题: 如果我登录到localhost:8000并导航到分析。localhost:8000我会得到401响应 You

我正在使用Django建立一个博客,我已经实现了一个分析工具,可以让我绘制关于访问者的详细信息(来源国、设备、浏览器等)

分析。localhost:8000localhost的子域,定义为基于类的视图,具有自定义的MixinSuperuserAccessRequired,如果用户不是员工,则返回401个未经授权的(我正在使用django主机处理子域&这是我第一次使用子域。)

我的问题:

如果我登录到localhost:8000并导航到分析。localhost:8000我会得到401响应

You are seeing this as:  AnonymousUser # generated by print(You are seeing this as: ', request.user) from SuperuserAccessRequired
Unauthorized: /
[25/Sep/2019 13:14:03] "GET / HTTP/1.1" 401 89
我谦虚的假设是,localhost:8000x.localhost:8000没有共享某些变量

如何解决这个问题,我已经阅读了django hosts文档5次,但似乎找不到我缺少的东西

我的代码:

project/root/settings.py

...
ALLOWED_HOSTS = ['localhost']
ALLOWED_HOSTS += ['analysis.localhost', 'blog.localhost']

SITE_ID = 1

INSTALLED_APPS += [
    # Django Apps

    'blog',
    'analysis',
]

INSTALLED_APPS += [
    # Django Dependencies

    'sass_processor',
    'django_hosts',
]


MIDDLEWARE = [
    'django_hosts.middleware.HostsRequestMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'analysis.middleware.TrackVisitorMiddleware',
    'django_hosts.middleware.HostsResponseMiddleware',
]

ROOT_URLCONF = 'root.urls'
ROOT_HOSTCONF = 'root.hosts'
BLOG_URLCONF = 'blog.urls'
ANALYSIS_URLCONF = 'analysis.urls'
DEFAULT_HOST = 'www'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'analysis': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'analysis_db.sqlite3'),
    }
}

...
project/root/hosts.py

host_patterns = patterns('',
    host(r'localhost:8000', settings.ROOT_URLCONF, name='www'),
    host(r'analysis.localhost:8000', settings.ANALYSIS_URLCONF, name='analysis'),
    host(r'blog.localhost:8000', settings.BLOG_URLCONF, name='blog'),
)
自定义混音:

class SuperuserAccessRequired(AccessMixin):
    """Verify that the current user is staff."""
    def dispatch(self, request, *args, **kwargs):
        print('You are seeing this as: ', request.user)
        if not request.user.is_staff:
            return HttpResponse(status=401, content='You are not authorized to view this page.')
        return super().dispatch(request, *args, **kwargs)
更新

如果我从analysis.localhost中删除端口号,我会被重定向到Apache默认页面…奇怪。(只需关闭此更新,我忘记了/etc/hosts,伙计,我正在丢失它)

更新2

深入研究这个问题,我似乎不得不重写我的SessionMiddleware


任何帮助/指导都将不胜感激。

您需要为子域之间的共享COOKIE设置会话\u COOKIE\u域

SESSION_COOKIE_DOMAIN = '.localhost'
SESSION_COOKIE_NAME = 'sharesession'

查看更多信息

我尝试了这个解决方案,但它阻止了我登录。这正是django文档所说的。我已经将所有内容移动到django rest框架下,现在我可以登录到那里,并可以通过跳转到api查看我的分析页面。localhost:8000/analysis/