金字塔中的不同登录视图

drn*_*gis 7 python pyramid

有些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.

bag*_*rat 4

您可以将这两个错误包装到您的自定义错误中,并引发它来代替这两个错误。然后,您可以处理异常并为每个错误运行所需的方案。这是一个例子:

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类中实现你的处理逻辑。