1

Google App Engine Webapp フレームワーク アプリケーションのコンテキストでは:

パラメータ _method が指定されている場合に、リクエストのリクエスト動詞を変更したい。たとえば、POST リクエストがパラメータ _method=PUT で受信された場合、ハンドラーの put メソッドを呼び出すようにリクエストを変更する必要があります。これは、prototype.js が PUT や DELETE (IE の回避策) などの動詞を処理する方法に対処するためです。これが私の最初の試みです:

クラス MyRequestHandler (webapp.RequestHandler):
   def initialize(self、リクエスト、レスポンス):
       m = request.get('_method')
       もしm:
           request.method = m.upper()
       webapp.RequestHandler.initialize(セルフ、リクエスト、レスポンス)

問題は、何らかの理由で、リダイレクトが行われるたびに、初期化が呼び出されたときに設定されていても、処理メソッド (put または delete) が呼び出されるまでに self.request.params が空になることです。これがなぜなのか、誰にも手がかりがありますか?回避策として、initialize() 時に params を複製できると考えましたが、.copy() は機能せず、その方法も見つかりませんでした。

更新: Arachnid から非常に役立つ回答を受け取りました。私がたどり着いた解決策は、メタクラスを使用しています。以下にあります。

4

2 に答える 2

3

とにかく、初期化からハンドラーを呼び出すのは正しい方法ではありません。そうすると、webapp は元のハンドラーも呼び出します。

代わりに、いくつかのオプションがあります。

  • webapp.WSGIApplication をサブクラス化し、呼び出しをオーバーライドして、存在する場合は _method に基づいてメソッドを選択できます。
  • initialize で _method の存在を確認できます。存在する場合は、それに応じてリクエスト オブジェクトの「REQUEST_METHOD」環境変数を変更します。これにより、選択したメソッドが WSGIApplication クラスで実行されます。

いずれにしても、SDK の google/appengine/ext/webapp/ init .py を見て、その仕組みを確認してください。

于 2008-11-01T18:22:13.057 に答える
2

それはあなたの応答のためのクモ類です。フレームワークのソースを教えてくれて本当に助かりました。最後に、ソースが存在しないことを確認しました (.pyc しかありませんでした)。SDK の新しいバージョンで変更された可能性があります。私の状況では、WSGIApplication をオーバーライドすることは正しいことだったと思います。ただし、代わりにメタクラスを使用することを選択しました。これは、フレームワーク コードの束を自分のコードにカーゴカルト (コピー) してから変更する必要がなかったからです。これが私の解決策です:

クラス RequestHandlerMetaclass(タイプ):
    def __init__(cls, name, bases, dct):
        super(RequestHandlerMetaclass, cls).__init__(name, bases, dct)
        org_post = getattr(cls, '投稿')
        def post(self, *params, **kws):
            動詞 = self.request.get('_method')
            もし動詞:
                動詞 = 動詞.upper()
                動詞 == '削除' の場合:
                    self.delete(*params, **kws)
                elif 動詞 == 'PUT':
                    self.put(*params, **kws)
            そうしないと:
                org_post(self, *params, **kws)
        setattr(cls, '投稿', 投稿)

クラス MyRequestHandler (webapp.RequestHandler):
    __metaclass__ = RequestHandlerMetaclass
于 2008-11-02T17:35:47.190 に答える