4

次のような HTTP 文字列を送信していたサーバーと通信しています。

/path/to/my/handler/?action-query&id=112&type=vca&info=ch=0&type=event&ev16[sts=begin (...)

そのため、「info」GET パラメータには「=」と「&」の文字が含まれていました。それはかなり非正統的でしたが、それにもかかわらず、パーサーを作成しました。しかし、最近彼らはその一部をエンコードすることを決定したので、文字列は次のようになります..

/path/to/my/handler/?action=query&id=112&type=vca&info=ch%3D0%26type%3Devent%26ev46[sts%3Dbegin (...)

これにより、最初のような文字列を期待するパーサーが機能しなくなります。

古いコードを使用できるように (パーサーを書き直しても文字列が壊れないように)、どうにかして文字列を「エンコード解除」できますか?

以下の回答に従って、urllib.unquote() を使用して文字列をクリーンアップできます。ただし、最初の文字列に基づいて設定される request.GET に依存しています。新しい変換された文字列に基づいて GET オブジェクトを再構築することは可能ですか、または何らかの方法で再評価を強制することはできますか?

4

1 に答える 1

5

あなたが望むのはモジュールのunquote機能だと思います。urllib

>>> s = '/path/to/my/handler/?action=query&id=112&type=vca&info=ch%3D0%26type%3Devent%26ev46[sts%3Dbegin'
>>> import urllib
>>> urllib.unquote(s)
'/path/to/my/handler/?action=query&id=112&type=vca&info=ch=0&type=event&ev46[sts=begin'

編集:私は Django にあまり詳しくありませんが、ドキュメントの要求と応答オブジェクトのセクションには次のように記載されています。

copy() を作成しない限り、QueryDict インスタンスは不変です。つまり、request.POST と request.GET の属性を直接変更することはできません。

これらのドキュメントの私の限定的な読み取りに基づいて、unquote()関数をHttpRequest.body属性に適用し、結果から新しいものを作成できるQueryDict場合があります (必要に応じて、それを使用して現在のものを更新することもできます)。

于 2012-06-26T20:19:14.020 に答える