1

webapp2で、ルーティングされたすべてのパラメーターをutf-8として自動的にデコードしてから、ハンドラーのget()メソッドに送信しようとしています。すべてのハンドラーが継承するBaseHandlerクラスでdispatch()をオーバーライドしようとしましたが、パラメーターを変更するのではなく、要求オブジェクトを介してパラメーターを読み取ることしかできませんでした。これをどのように行うのが最善でしょうか?

編集

残念ながら、これは従来のGETパラメータに関するものではなく、ハンドラーのget()メソッドがキーワード引数として受け取るURLのルーティングされた部分に関するものです。一致したURLのUnicode文字が含まれている場合は、.decode('utf-8')である必要があります。そうでない場合、UnicodeDecodeErrorが発生します。システム内のすべてのハンドラーとルーティングされたパラメーターに対してこれらのデコードを手動で実行する必要はありません。

4

2 に答える 2

2

これは、デコードが完全に自動的に処理されるため、私が解決した解決策です。

他のハンドラーが継承する基本ハンドラークラスのdispatch()メソッドをオーバーライドし、それに次のコードを追加します。

route_kwargs_decoded = {}
for key, value in self.request.route_kwargs.iteritems():
    route_kwargs_decoded[key] = value.decode('utf-8')
self.request.route_kwargs = route_kwargs_decoded

webapp2開発者にとっては、これを将来のwebapp2バージョンの機能として実装することを検討する価値があると思います。これは、フレームワークによって、または少なくとも設定を通じて自動的に処理される必要があるように思われるためです。

于 2012-10-30T21:39:08.610 に答える
1

これを行う1つの方法は、デコレータを使用することです。これは完全に自動ではありませんが、より明確です。

def decode_utf8(inner):
  def func(self, *args, **kwargs):
    args = [x.decode('utf8') for x in args]
    kwargs = dict((k, v.decode('utf8')) for k, v in kwargs.items())
    return inner(self, *args, **kwargs)
  return func

次に、これを使用して、引数をデコードするメソッドを装飾します。

class MyHandler(webapp2.RequestHandler):
  @decode_utf8
  def get(self, foo, bar):
    #...
于 2012-10-29T14:39:32.033 に答える