Python 如何获得附加到金字塔中被调用视图的权限?

Python 如何获得附加到金字塔中被调用视图的权限?,python,pylons,pyramid,Python,Pylons,Pyramid,在我的禁止视图中,如果所有成员访问来宾页面,我希望将其重定向到仪表板;如果所有来宾访问成员页面,我希望将其重定向到登录页面。这很容易 但是,在某些情况下,我需要抛出一个HTTPForbidden错误,这不是权限失败的原因,只需向用户显示原因。我如何确定HTTPForbidden是由于许可失败还是其他原因造成的?我想我可以用pyramid.security.has_permission(还没有尝试过),做一些奇怪的事情,但必须有一个更简单的方法 2011年提出的一个老问题,其中指出这是在待办事项列

在我的禁止视图中,如果所有成员访问来宾页面,我希望将其重定向到仪表板;如果所有来宾访问成员页面,我希望将其重定向到登录页面。这很容易

但是,在某些情况下,我需要抛出一个HTTPForbidden错误,这不是权限失败的原因,只需向用户显示原因。我如何确定HTTPForbidden是由于许可失败还是其他原因造成的?我想我可以用
pyramid.security.has_permission
(还没有尝试过),做一些奇怪的事情,但必须有一个更简单的方法


2011年提出的一个老问题,其中指出这是在待办事项列表上,我还没有测试过它,但我会尝试在手动执行此操作的地方提出一些其他问题。您甚至可以子类化
httpophibidden

class WeDontLikeYourFace(HTTPForbidden):
    pass

def my_view(context, request):
    if request['face'] != 'beautyful':
        raise WeDontLikeYourFace("go away")
然后,您可以为自定义异常注册自定义视图,或者在为http注册的公共视图方法中执行一些if/else操作


您还可以将自定义字段添加到子类中,以传递所需的任何信息。

这并不是您所要求的,但它仍然可以帮助您。 对您的问题已经给出了正确的答案:您最好提出一个比
httpabforbidden
更合适的特定异常

但是,如果您真的想根据触发
httpoblimited
异常的缺少权限来更改禁止视图的行为,则需要获取其名称。 缺少权限的名称可以在
httpoblimited.result.permission
中的
httpoblimited
异常对象中找到。 但是首先,需要将
httpoblimited
异常作为禁止视图的上下文传递

例如,以下是我如何在我的webapps中使用它来通知用户为什么他无法访问某个特定功能,以便他可以 如果合适,请经理相应地重新配置ACL

@forbidden_view_config(renderer='/forbidden.mako')
def forbidden(context, request):
    return { 'required_permission': context.result.permission }
它适用于金字塔1.4。 我在文档中找不到任何东西,所以我通过调试金字塔对其进行了黑客攻击。
这与其说是一个干净的解决方案,不如说是一个变通办法。

我考虑过这样做,但我希望会有一个更简单的方法。另外,逻辑
如果异常,则显示禁止页面()。因为权限失败而引发页面()。否则手动引发异常,显示原因(异常。原因消息)
有点不明确,感觉像是使用了一种几乎意想不到的副作用,即手动引发异常,而不是通过金字塔机制。