2

次のように定義された RootFactory があります。

class RootFactory(object):
    __parent__ = None
    __name__ = None

    def __init__(self, request):
        self.request = request

    def __getitem__(self, key):
        if key == "user":
            dispatch = UserSelector(self.request)
            dispatch.__name__ = key
            dispatch.__parent__ = self
            return dispatch

class UserSelector(object):
    __parent__ = None
    __name__ = None

    def __init__(self, request):
        self.request = request

    def __getitem__(self, key):
        dispatcher = UserDispatcher(self.request)
        dispatcher.__name__ = key
        dispatcher.__parent__ = self
        return dispatcher

class UserDispatcher(object):
    __parent__ = None
    __name__ = None

    def __init__(self, request):
        self.request = request

    def __getitem__(self, key):
        user = self.request.db.query(User)
        user = user.get(key)
        if not user:
            raise KeyError
        dispatcher = UserDispatcher(self.request)
        dispatcher.__name__ = key
        dispatcher.__parent__ = self
        dispatcher.user = user
        return dispatcher

これは私が継承したプロジェクトからのもので、これがどのように機能するかを理解しようとしています。プロジェクトは、SQL 錬金術の足場です。そのため、GETリクエストがlocalhost:6543/userのインスタンスに着信するRootFactoryと、 が作成され、__getitem__メソッドが実行されます。これは のインスタンスを返しますUserSelector

__getitem__で が実行される原因は何UserSelectorですか?

また、リクエストが であるPUTか、オブジェクトPOSTをインスタンス化するものは何ですか?UserDispatcher

my では、リクエストUserViews UserDispatchのコンテキストとして渡されます。PUTを送信しようとするとPUT404 The resource could not be found. predicate mismatchビューが表示されますUserViews (request_method = GET,HEAD)。ここで述語とは何を指していますか?

PUTデータに問題がありますか?

4

1 に答える 1

0

__getitem__で が実行される原因は何UserSelectorですか?

最善の策は、 Traversalがどのように機能するかを説明しているPyramid Traversalのドキュメントを読むことです。

したがって、次のような URL の場合:

/user/test/

  1. トラバーサーはルート ファクトリを作成します
  2. トラバーサーはルート ファクトリを取得し、次の URL 要素 ( user) を取得してルート ファクトリを呼び出し__getitem__ます。これにより、新しいオブジェクトが返されます。
  3. トラバーサーは次の URL 要素 ( ) を受け取り、新しいオブジェクトtestを呼び出します (この場合は a )__getitem__UserDispatcher

また、リクエストが であるPUTか、オブジェクトPOSTをインスタンス化するものは何ですか?UserDispatcher

トラバーサルは、ビューのルックアップが開始される前に行われ、2 つのスラッシュの間にある URL 内のすべての要素に厳密に基づいています。

/user/test/posts/には 3 つの要素 ( usertestposts) があります。そのUserDispatcherため、URL がトラバースできる場合にのみインスタンス化されます。

ここで述語とは何を指していますか?

ここでの述語は、ビューに設定したさまざまな制限を指します。GETビューがor (デフォルト)に対してのみ実行できることを Pyramid に伝えると、HEAD他のすべての HTTP 動詞を拒否します。Pyramid が着信リクエストに対して実行するビューを検索するとき、述語の一致を試みます。1 つ以上の述語が一致しない場合を除いて、ビューが機能した可能性がある場合、エラーが発生します。このエラーは、一致する可能性のあるものを探し尽くした場合にのみ発生します。

エラーが発生すると、それは Pyramid を介して伝搬され、最終的に404 - Not Foundエラーにつながります。要求に一致するビューPUTが必要な場合は、述語を変更する必要があります。

于 2014-07-02T05:17:37.333 に答える