我有一个金字塔项目,有 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
然后,这是我的views.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',
}