Django process_view中间件导致403被禁止

时间:2011-01-11 12:43:21

标签: django django-middleware

如果用户使用临时密码,我写了一小部分中间件,如果是,则将它们重定向到强制他们创建新密码的页面。我的问题是,当用户登录并且不使用临时密码时页面工作正常(即他们手动转到更改密码URL),但是当他们使用临时密码时,来自中间件的重定向产生403 Forbidden页面

中间件在临时密码检查后在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 个答案:

答案 0 :(得分:2)

首先,我认为您的缩进在示例中是关闭的,但是作为检测当前路径何时 change_password URL的解决方案如何?这应该摆脱你继续进行的无限重定向。

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

答案 1 :(得分:0)

您使用的是哪个版本的django?

如果您使用的是最新测试版,则设置日志记录可能会有所帮助

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

答案 2 :(得分:0)

Django Debug Toolbar可能会对您有所帮助。它可以捕获重定向并显示它在实际去那里之前重定向的位置。这有助于减少损坏的重定向。

也就是说,我建议为具有临时密码的用户使用不同的“更改密码”页面,以便它可以以不同方式处理权限检查。您拥有的页面可能包含@login_required装饰器,并且可能不会将临时密码视为“真正”登录。