ここでの基本的な原則は、ピラミッドのセキュリティ機構が現在のコンテキストでACLをチェックすることです。この場合、ページは使用する論理的なコンテキストになります。最初のステップは、ページのコンテキストファクトリを設定することです。 SQLAlchemyとURLディスパッチを使用していると仮定すると、これは簡単です。
config.add_route('page', '/pages/{id:\d+}', factory=page_factory)
ピラミッドは、あなたが自分でいることを確認する必要はありませんので、ページIDは数字でなければなりません確認しますルートのパスに少しトリックがあります:このようなあなたのルートを登録します。 * page_factory *メソッドへの参照に注意してください。
def page_factory(request):
return DBSession.query(Page).get(int(request.matchdict['id']))
これはルートからページIDを取得し、そのページIDを使用してデータベース内のページを検索します。ここでIDを整数に変換できるかどうかはチェックしないことに注意してください。ルートがすでに直接そのIDをチェックしているため、IDを取得できます。
次の手順は、ページにACLを設定することです。最も簡単な方法は、あなたのページクラスにACLプロパティを追加することです:
from pyramid import security
class Page(BaseObject):
@property
def __acl__(self):
return [(security.Allow, self.userid, 'view')]
このACLだけpage.useridに記憶されたIDを持つユーザーがそのページを表示することが許可されているピラミッドを伝えます。ここで重要なことは、ACLがページごとに異なることです。ACLは、データベース内の情報に基づいて別々のページごとに生成されます。この場合はself.useridを使用します。
@view_config(route_name='page', context=Page, permission='view')
def page_view(context, request):
return 'I can see!'
この例では、ページのために非常に最小限のACLを持っていますが、あなたのニーズに合わせてそれを拡張することができます。
今、あなたのビューにビュー許可を使用することができます。
view_configのcontext = Pageパラメータにも注意してください。これは、このビューをコンテキストのみで使用する必要があることをpyramidに通知します。コンテキストファクトリ(この例ではpage_factory)が一致するページを見つけなかった場合、Pageインスタンスの代わりにNoneが返されるため、このビューはピラミッドでは使用されません。その結果、ピラミッドは自動的に見つからないエラーを生成します。
あなたのルートファクトリが 'None'を返した場合、コンテキストは' None'です。ビューが見つからない限り自動的に404は発生しません。あなたの例では、 'page_view'が見つかりましたが、' None'が '__acl__'を持たないコンテキストのため禁止されています。 –
最後にクリックされました。今日までは、PageクラスとACLとSQLAlchemy Pageの 'table class'との間には関係がありませんでした。それはすべて今一緒に彫り始めている。 – Kane
マイケル:良い点。その動作を行う1つの方法は、view_config呼び出しでcontext = Pageを追加することです。私はそれを反映するために私の答えを更新します。 –