如果用户使用临时密码,我写了一小部分中间件,如果是,则将它们重定向到强制他们创建新密码的页面。我的问题是,当用户登录并且不使用临时密码时页面工作正常(即他们手动转到更改密码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无法跟上,也无法真正退出它呈现的页面。
答案 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)
答案 2 :(得分:0)
Django Debug Toolbar可能会对您有所帮助。它可以捕获重定向并显示它在实际去那里之前重定向的位置。这有助于减少损坏的重定向。
也就是说,我建议为具有临时密码的用户使用不同的“更改密码”页面,以便它可以以不同方式处理权限检查。您拥有的页面可能包含@login_required
装饰器,并且可能不会将临时密码视为“真正”登录。