2011-01-11 24 views
0

我已经写了一小部分中间件,用于捕获用户是否使用临时密码,如果是,则将它们重定向到强制他们创建新密码的页面。我的问题是,当用户登录并且没有使用临时密码(即他们手动进入更改密码URL)时,页面可以正常工作,但是当他们使用临时密码时,来自中间件的重定向会生成403 Forbidden页面。Django process_view中间件导致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不能跟上,以及它无法真正退出它呈现的页面。

+0

这不是引发403的代码。但是,这段代码会导致无限重定向。 – 2011-01-11 13:23:35

+0

HttpResponseRedirect行导致403,在Django内部的某个地方,实际的403被引发。如果该行被更改为'return HttpResponse(“test”)',它可以正常工作,所以它确实与重定向触发有关。 – 2011-01-11 14:13:05

回答

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 
0

Django Debug Toolbar可能会有所帮助在这里。它可以捕获重定向并在实际出现之前向您显示重定向的位置。这有助于运行破碎的重定向。这就是说,我建议为临时密码的用户使用不同的“更改密码”页面,因此它可以以不同方式处理权限检查。您可能拥有一个@login_required装饰器,并且临时密码可能不会被视为“真正”登录。