【发布时间】:2014-01-22 11:39:06
【问题描述】:
not hard to check Pyramid 中某个资源的权限。我想知道如何确定某个路由对应的权限类型和资源。
详细信息。假设我添加了一条路线
config.add_route('resource.edit', '/t/{resource_id:\d+}/edit',
factory = FactoryFactory('resource') ))
FactoryFactory 是一个返回工厂的函数。在这种情况下,它会为 "resources" 返回一个工厂,不管它是什么。后来,我是这样去的:
@view_config(
route_name='resource.edit',
renderer='resource-edit.pt',
permission='edit'
)
def edit(resource_object, request):
...
在某个时候,我将在网站上生成一个输入元素,该元素将链接到
request.route_url('resource.edit', resource_id=some_input)
编辑:根据要求,我会给你确切的模板代码,希望这能让你更好地了解情况。我们使用的模板引擎是 Chameleon。
<a href="${request.route_url('resource.edit', resource_id=res.id)}"
class="btn btn-info morespacing"><i class="icon-edit"></i>edit</a>
现在我想要的是这样的:
<a tal:condition="h.route_accessible(request, 'resource.edit', res.id)"
href="${request.route_url('resource.edit', resource_id=res.id)}"
class="btn btn-info morespacing"><i class="icon-edit"></i>edit</a>
换句话说:我想仅在用户有权执行编辑操作时才显示此输入元素。
现在,我可以给你举个例子,说明什么可行但对我没有吸引力,因为它不灵活。我编写了一个辅助函数
def can_edit(request, factory_type, res_id):
resource = FactoryFactory(factory_type)(res_id)
return has_permission('edit', resource, request)
然后我写
<a tal:condition="h.can_edit(request, 'resource', res.id)"
href="${request.route_url('resource.edit', resource_id=res.id)}"
class="btn btn-info morespacing"><i class="icon-edit"></i>edit</a>
这对我没有吸引力,因为有关工厂的信息和有关权限的信息已被编码到路由中,所以我觉得我应该能够通过简单地提供来访问它路线的名称。
因此,我正在寻找一种从路由信息(即字符串'resource.edit' 和资源ID some_input)获取资源和权限的方法。这可能吗?如果是,怎么做?
非常感谢您。
【问题讨论】:
-
我多次阅读你的问题,我不明白你的意思。很可能您正在寻找常见问题的解决方案。您要求提供实现细节,但您应该使用 ACL 解释您的资源模型、具有权限的用户,并在某些 URL 上演示您的问题以说明上下文。
-
真的没什么好说的了......我想要一个函数,它将路由名称(在上述情况下为
'resource.edit')、资源ID和请求对象作为输入如果当前用户有权访问该路由,则返回True,否则返回False。 -
现在,您有 2 个答案。两者似乎都对您没有太大帮助。可能意味着您没有很好地解释您的问题。添加一些视图代码和/或模板代码来显示您的问题。您想为每个小辅助函数开始赏金,还是获得一些建议来选择适合您的问题领域的金字塔概念?
-
为了您的方便,我将添加一些模板代码。但是,请不要光顾。我有一个非常具体的问题,它与适合我的问题领域的金字塔概念无关。这是一个关于在给定已通过
view_config设置的路由名称的情况下确定访问权限的技术问题。
标签: python python-2.7 permissions pyramid