в моем проекте я использую django-hosts для разработки загрузок на downloads.foo.bar вместо foo.bar/downloads.
Получение данных контекста и т. Д. Работает нормально, но я хочу, чтобы скачивание было разрешено только аутентифицированным пользователям.
Представление, которое вызывается, является IndexDownloadView.
Сначала я попробовал LoginRequiredMixin. При этом меня всегда перенаправляли на страницу входа в систему при обращении к любой ссылке на поддомен downloads.
Вход в систему управляется через пользовательское приложение в моем проекте и хосте основного приложения.
Чтобы выяснить, в чем дело, я убрал Mixin и напечатал (self.request.user) на своем поддомене-cbv, который возвращает AnonymousUser. Делая это в моем основном приложении (без субдомена), он возвращает зарегистрированного пользователя.
Одна вещь, которую я считаю странной:
Я расширяю шаблон поддоменов из base.html. В base.html есть кнопка в меню со ссылкой / текстом для входа или выхода из системы в зависимости от {% if request.user.is authenticated%} в шаблоне. Этот фрагмент, кажется, распознает аутентифицированного пользователя, потому что логика показывает страницу входа, если не аутентифицировано, наоборот.
Блок с основным контентом отсутствует.
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'