【发布时间】:2013-07-16 10:35:14
【问题描述】:
我有一个金字塔项目,有 2 个部分:
-
/_hq/需要通过登录页面进行身份验证 -
/_rest/需要 RESTful 身份验证(通过 HTTP 基本/摘要式身份验证)
所以,我添加了 2 个主要资源工厂的路由:HQFactory 和 RESTFactory。我已经构建了一个身份验证策略切换器来切换每个资源的 AuthenticationPolicy。它奏效了。
我也使用 ACLAuthorizationPolicy。
对于每个请求,我想返回一个登录页面或401 HTTP状态取决于正在访问的资源工厂。
我的问题是我只能为一个视图执行 @forbidden_view_config。如何为每个资源工厂指定出价视图或针对我的问题的其他解决方案?
谢谢
已解决 - 解决方案
最简单的方法是 Michael Merickel 的回答(您可以在下面看到)。这里还有另一种方式:
已弃用
我通过使用 view_config 中的 custom_predicates arg 解决了我的问题。就是这样。
我创建了一个函数作为自定义谓词:
def resource_factory_predicate(factory):
def check_factory(context, request):
return isinstance(request.context, factory)
return check_factory
然后,这是我的意见.py
# views.py
@forbidden_view_config(
custom_predicates=(resource_factory_predicate(RootFactory),))
def login_required(request):
userid = authenticated_userid(request)
if userid is not None:
return HTTPForbidden("You're not authorized for this action")
# redirect to login page
@forbidden_view_config(renderer='json',
custom_predicates=(resource_factory_predicate(RESTfulFactory),))
def http_403_unauthenticated(request):
request.response.status = 403
return {
'status': 0,
'message': 'Forbidden',
}
【问题讨论】:
-
为什么你只能为一个视图做
@forbidden_view_config? Pyramid 没有限制它。使用谓词注册两个这样的视图。 -
是的,我考虑过将上下文传递给@forbiden_view_config,但它有限制作为我对您的回答的评论。