在我的项目中,我使用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'