В моем проекте 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)