0

我编写了一小部分中间件,可以捕获用户是否使用临时密码,如果是,则将他们重定向到强制他们创建新密码的页面。我的问题是,当用户登录并且不使用临时密码(即他们手动转到更改密码 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 无法跟随,并且无法真正退出它渲染的页面。

4

3 回答 3

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
于 2011-01-11T15:02:04.223 回答
0

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

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

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

于 2011-01-11T13:22:43.020 回答
0

Django 调试工具栏在这里可能会有所帮助。它可以捕获重定向并在实际到达之前向您显示重定向的位置。这有助于消除损坏的重定向。

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

于 2011-01-11T15:00:08.193 回答