@ron6500

Почему редирект работает в «чистом» виде, но не работает из функции?

Возможно это очень простая, но пока не очевидная для меня вещь. Почему этот код работает...
@login_required
def mem_area(request):
    """ Returns Member Area HTML with data """
    user = request.user

    if user.is_staff:
        return redirect('/')

    user_info = UserInfo.objects.get(user_id=user.id)
    page_title = 'Dashboard'
    return render(request, 'user_resume/member_area/member_area.html', locals())

а этот нет? Под "не работает" имею ввиду, что не происходит редиректа, а админ попадает туда, куда не следует.
def admin_redirect(user):
    """ Checks if user is admin and don't let him open member area  """
    if user.is_staff:
        return redirect('/')

@login_required
def mem_area(request):
    """ Returns Member Area HTML with data """
    user = request.user

    admin_redirect(user)

    user_info = UserInfo.objects.get(user_id=user.id)
    page_title = 'Dashboard'
    return render(request, 'user_resume/member_area/member_area.html', locals())

Разница лишь в том, что я вынес проверку "на админа" и редирект в отдельную функцию.
Если я меняю return на raise Http404, то все ок, но мне нужен редирект
  • Вопрос задан
  • 250 просмотров
Пригласить эксперта
Ответы на вопрос 2
flygrounder
@flygrounder
Python/Django
Потому что объект redirect возвращается в поле видимости вашего view, но сам view его не возвращает.
Исключение же прерывает все функции и возвращает 404
Ответ написан
Astrohas
@Astrohas
Python/Django Developer
def admin_redirect(user):
    """ Checks if user is admin and don't let him open member area  """
    if user.is_staff:
        return redirect('/')

@login_required
def mem_area(request):
    """ Returns Member Area HTML with data """
    user = request.user

    redirect = admin_redirect(user)
    if redirect:
      return redirect
    user_info = UserInfo.objects.get(user_id=user.id)
    page_title = 'Dashboard'
    return render(request, 'user_resume/member_area/member_area.html', locals())
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы