有些URL由我的Pyramid应用程序处理.当未经身份验证的用户尝试打开任何URL时,用户将被重定向到登录表单:
def forbidden(request):
if request.user.keyname == 'guest':
return HTTPFound(location=request.route_url('auth.login',))
request.response.status = 403
return dict(subtitle=u"Access denied")
config.add_view(forbidden, context=HTTPForbidden, renderer='auth/forbidden.mako')
Run Code Online (Sandbox Code Playgroud)
但对于一些网址(路由),我不得不返回登录表单,而是返回401 Unauthorized status code带有WWW-Authenticate标题的表单.我如何设置我的路线来实现这一目标?我猜我必须使用route_predicate.
您可以将这两个错误包装到您的自定义错误中,并引发它来代替这两个错误。然后,您可以处理异常并为每个错误运行所需的方案。这是一个例子:
class YourError(HTTPException):
def __init__(self, error):
super(YourError, self).__init__()
self.error = error
def handle(self, request):
if error is HTTPForbidden or is instance(error, HTTPForbidden):
return self._handle403(request)
elif error is HTTPUnauthorized or is instance(error, HTTPUnauthorized):
return self._handle401(request)
def _handle403(self, request):
# do your stuff for 403
def _handle401(self, request):
# do your stuff for 401
# ...modify your view
def forbidden(context, request):
return context.handle(request)
Run Code Online (Sandbox Code Playgroud)
然后编辑您的视图配置:
config.add_view(forbidden, context=YourError, renderer='auth/forbidden.mako')
Run Code Online (Sandbox Code Playgroud)
然后在其他需要返回403或 的视图中401,按以下方式操作:
def another_view(request)
...
raise YourError(HTTPForbidden)
# or
raise YourError(HTTPUnauthorized)
...
Run Code Online (Sandbox Code Playgroud)
然后你只需要在YourError类中实现你的处理逻辑。
| 归档时间: |
|
| 查看次数: |
375 次 |
| 最近记录: |