Пользователь становится анонимным при перенаправлении на просмотр с помощью метода Decorator - PullRequest
0 голосов
/ 09 мая 2019

В моем проекте Django есть приложение, которое проверяет пользователя перед тем, как получить доступ к представлению, и перенаправить его в представление входа в систему, если нет. Я столкнулся с проблемой, когда у пользователей в файлах cookie может быть токен, который обозначает их как специального пользователя, который должен иметь возможность просматривать страницу. В моем коде для страницы входа в систему при первом доступе они могут не проходить проверку подлинности, поэтому декоратор метода будет перенаправлен на страницу входа, которая проверит токены, а затем перенаправит их страницу на запрошенную страницу. Проблема, с которой я сталкиваюсь, заключается в том, что даже после аутентификации пользователя на странице входа в систему при перенаправлении его они отображаются в качестве анонимного пользователя в декораторе. Может кто-нибудь объяснить, почему это происходит.

Код для обзора:

def login_required(function=None, login_url='/login/', redirect_field_name='next'):
    actual_decorator = user_passes_test(
        lambda u: u.is_authenticated,
        login_url=login_url,
        redirect_field_name=redirect_field_name
    )

    if function:
        return actual_decorator(function)
    return actual_decorator

@method_decorator(login_required, name='dispatch')
class DataViewSet(viewsets.ModelViewSet):
    pass

class FormLoginView(FormView): # Form stuff omitted
    template_name = 'login.html'
    form_class = LoginForm

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        if request.user.is_authenticated:
            context['JWT'] = self.request.user.get_token()
        return context

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            try:
                # Find token
                request.user = auth.authenticate(request, token=token)
            except jwt.InvalidTokenError:
                token = None

        if request.user.is_authenticated:
            redirect_url = self.request.GET.get('next')

            if redirect_url:
                return redirect(redirect_url)
        return super().dispatch(request, *args, **kwargs)
...