私は2つの部分を持つピラミッドプロジェクトを持っています:
/_hq/
ログインページによる認証が必要/_rest/
RESTful 認証が必要 (HTTP Basic/Digest 認証による)
そこで、 HQFactoryとRESTFactoryという 2 つの主要なリソース ファクトリを含むルートを追加します。リソースごとに AuthenticationPolicy を切り替える認証ポリシー スイッチャーを作成しました。出来た。
ACLAuthorizationPolicy も使用します。
リクエストごとに、ログイン ページまたは401 HTTP ステータスを返したいのですが、どのリソース ファクトリがアクセスされているかによって異なります。
私の問題は、1 つのビューに対してのみ@forbidden_view_configを実行できることです。リソース ファクトリごとのビッデン ビューまたは問題の別のソリューションを指定するにはどうすればよいですか?
ありがとうございました
解決済み - 解決策
最も簡単な方法は、Michael Merickel の回答です (以下で確認できます)。ここに別の方法があります:
非推奨
view_config の custom_predicates 引数を使用して問題を解決しました。これです。
カスタム述語として関数を作成しました。
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',
}