django-hosts:子域上的self.request.user返回AnonymousUser

时间:2018-08-29 18:45:03

标签: django python-3.x django-hosts

在我的项目中,我使用django-hosts在downloads.foo.bar而不是foo.bar/downloads上开发下载内容。 获取上下文数据等一切正常,但我希望下载仅限经过身份验证的用户。 被调用的视图是IndexDownloadView。

首先,我尝试了LoginRequiredMixin。有了这个,我总是在调用downloads-subdomain的任何链接时都重定向到登录页面。

通过我的项目和主应用程序主机中的用户应用程序管理登录。

要找出问题所在,我拿走了Mixin,并在返回AnonymousUser的subdomain-cbv上打印了(self.request.user)。在我的主应用程序(无子域)中执行此操作,它将返回已登录的用户。

我认为一件事很奇怪: 我从base.html扩展了子域模板。 base.html在菜单中具有一个Button,该链接/文本用于登录或注销,具体取决于模板中的{%(如果request.user.is已​​通过身份验证%})。此代码段似乎可以识别已验证的用户,因为如果未通过验证,则逻辑会显示登录页面。 没有包含主要内容的块。

hosts.py

from django_hosts import patterns, host
from django.conf import settings
host_patterns = patterns('',
    host(r'', settings.ROOT_URLCONF, name='main'),
    host(r'www', settings.ROOT_URLCONF, name='www'),
    host(r'downloads', 'downloads.urls', name='downloads'),
)

base.html

#Menu-stuff
{% if user.is_authenticated %}
    <form action="{% host_url 'users:logout' host 'main' %}">
        <button type="submit" class="btn btn-primary mr-2">
        <i class="fa fa-user"></i> Logout</button><div class="tooltip">Angemeldet als {{user}}</div>
    </form>
{% else %}
    <form action="{% host_url 'users:login' host 'main' %}">
        <button type="submit" class="btn btn-primary mr-2"><i class="fa fa-user"></i> Login</button>
    </form>
{% endif %}

settings.py #Middleware
将HostRequestMiddleware放在AuthenticationMiddleware之后并不能解决问题。

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',
    'django_hosts.middleware.HostsResponseMiddleware',
]

LoginRequiredMixin

class LoginRequiredMixin(object):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

class CacheMixin(object):
    def get_context_data(self, **kwargs):
        c = super().get_context_data(**kwargs)
        c['oeffnungText'] = TextFields.objects.get(name='oeffnungszeiten')
        c['anfahrt'] = TextFields.objects.get(name='anfahrt')
        return c

views.py

class SettingsMixin(object):

    def get_context_data(self, **kwargs):
        c = super().get_context_data(**kwargs)
        sites = Site.objects.all().exclude(slug='downloads')
        try:
            sitedata = sites.get(slug=self.kwargs['site_name'])
        except:
            sitedata = Site.objects.get(name=self.settings_name)
        c['sites'] = sites
        c['header'] = sitedata.head
        c['main'] = sitedata.main_html
        return c

class IndexDownloadView(LoginRequiredMixin, CacheMixin, SettingsMixin, TemplateView):
    template_name = 'index-downloads.html'
    settings_name = 'Downloads'

0 个答案:

没有答案