django-hosts: self.request.user на поддомене возвращает AnonymousUser - PullRequest
0 голосов
/ 29 августа 2018

в моем проекте я использую 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'
...