Промежуточное программное обеспечение Django process_view, приводящее к 403 запретам - PullRequest
0 голосов
/ 11 января 2011

Я написал небольшую часть промежуточного программного обеспечения, которое ловит, если пользователь использует временный пароль, и, если да, перенаправляет его на страницу, которая вынуждает его создать новый пароль. Моя проблема в том, что страница работает нормально, когда пользователь вошел в систему и НЕ использует временный пароль (т.е. они переходят на URL смены пароля вручную), но когда они используют временный пароль, перенаправление из промежуточного программного обеспечения приводит к 403 Запрещенной странице .

Промежуточное программное обеспечение делает еще одну вещь в process_view после проверки временного пароля, но это соответствующий код:

class MyMiddleware( object ):
  def process_view( self, request, view_func, view_args, view_kwargs ):
    if request.user.is_authenticated( ): 
      try:
        if request.user.get_profile( ).using_temp:
          return HttpResponseRedirect( reverse( 'change_password' ) )
        except Object.DoesNotExist:
          pass
        # Not using temp password, let the request process
        return None

Обратите внимание, что визуализация шаблона напрямую может использоваться с чем-то вроде render_to_response, чтобы исправить проблему, но это приведет к тому, что URL браузера не будет следовать, а также не сможет по-настоящему выйти из страницы, которую он отображает.

Ответы [ 3 ]

2 голосов
/ 11 января 2011

Во-первых, я думаю, что ваш отступ в этом примере отключен, но как насчет следующего в качестве решения для определения, когда текущий путь равен URL change_password? Это должно избавить вас от того бесконечного перенаправления, которое у вас происходит.

class MyMiddleware( object ):
  def process_view( self, request, view_func, view_args, view_kwargs ):
    if request.user.is_authenticated( ): 
      try:
        if request.user.get_profile( ).using_temp and request.path != reverse('change_password'):
          return HttpResponseRedirect( reverse( 'change_password' ) )
      except Object.DoesNotExist:
          pass
   # Not using temp password, let the request process
   return None
0 голосов
/ 11 января 2011

Панель инструментов отладки Django может быть полезна здесь. Он может перехватывать перенаправления и показывать вам, куда он перенаправляет, прежде чем перейти туда. Это помогает избежать неправильных перенаправлений.

Тем не менее, я бы порекомендовал использовать другую страницу «Смена пароля» для пользователей с временными паролями, чтобы она могла по-разному обрабатывать проверку разрешений. На вашей странице может быть @login_required декоратор, и временный пароль может не считаться «действительно» вошедшим в систему.

0 голосов
/ 11 января 2011

Какую версию django вы используете?

Если вы используете последнюю бета-версию, настройка ведения журнала может быть полезной

http://docs.djangoproject.com/en/dev/topics/logging/

...