39

BaseHTTPServer モジュールの BaseHTTPHandler は、http 要求パラメーターにアクセスする便利な方法を提供していないようです。パスから GET パラメータを解析し、リクエスト本文から POST パラメータを解析する最良の方法は何ですか?

今、私はこれをGETに使用しています:

def do_GET(self):
    parsed_path = urlparse.urlparse(self.path)
    try:
        params = dict([p.split('=') for p in parsed_path[4].split('&')])
    except:
        params = {}

これはほとんどの場合に機能しますが、エンコーディングと空のパラメーターなどのケースを適切に処理する、より堅牢なものが必要です。理想的には、完全な Web フレームワークではなく、小さくてスタンドアロンのものが欲しいです。

4

5 に答える 5

88

あなたは使用したいかもしれませんurllib.parse

>>> from urllib.parse import urlparse, parse_qs
>>> url = 'http://example.com/?foo=bar&one=1'
>>> parse_qs(urlparse(url).query)
{'foo': ['bar'], 'one': ['1']}

Python 2の場合、モジュールの名前は。urlparseの代わりになりurl.parseます。

于 2011-08-23T22:04:28.710 に答える
16

古い質問に対するより良い解決策:

def do_POST(self):
    length = int(self.headers.getheader('content-length'))
    field_data = self.rfile.read(length)
    fields = urlparse.parse_qs(field_data)

これにより、ドキュメント コンテンツから urlencoded POST データが取得され、適切な urldecoding を使用して dict として解析されます。

于 2015-07-12T03:03:43.530 に答える
5

Werkzeugモジュールを試すことができます。ベースの Werkzeug ライブラリはそれほど大きくなく、必要に応じてこのコードを抽出するだけで完了です。

このurl_decodeメソッドは MultiDict を返し、エンコーディングをサポートしています:)

urlparse.parse_qsWerkzeug バージョンが処理する方法とは対照的に:

  • エンコーディング
  • 複数の値
  • ソート順

これらが必要ない場合 (またはエンコーディングの場合は Python 3 を使用する場合) は、組み込みのソリューションを自由に使用してください。

于 2010-03-22T05:37:29.837 に答える
2

CherryPyなどのライブラリを使用して調査しましたか? それらは、BaseHTTPServer よりもこれらを処理するためのはるかに迅速なパスを提供します。

于 2010-03-22T05:46:13.377 に答える
1

基本的なHTTPリクエストパラメータのサポートは、CGIモジュールで提供されます。フォームデータを処理するために推奨されるメカニズムはcgi.FieldStorageクラスです。

送信されたフォームデータを取得するには、FieldStorageクラスを使用するのが最適です。このモジュールで定義されている他のクラスは、主に下位互換性のために提供されています。引数なしで、1回だけインスタンス化します。これは、標準入力または環境(CGI標準に従って設定されたさまざまな環境変数の値に応じて)からフォームの内容を読み取ります。標準入力を消費する可能性があるため、インスタンス化する必要があるのは1回だけです。

インスタンスは、PythonディクショナリのFieldStorageようにインデックスを付けることができます。in演算子を使用したメンバーシップテストが可能であり、標準の辞書メソッドkeys()と組み込み関数もサポートしていますlen()。空の文字列を含むフォームフィールドは無視され、辞書に表示されません。FieldStorageこのような値を保持するには、インスタンスの作成時にオプションのkeep_blank_valuesキーワードパラメーターにtrue値を指定します。

たとえば、次のコード(Content-Typeヘッダーと空白行がすでに印刷されていることを前提としています)は、フィールドnameとaddrの両方が空でない文字列に設定されていることを確認します。

form = cgi.FieldStorage()
if "name" not in form or "addr" not in form:
    print "<H1>Error</H1>"
    print "Please fill in the name and addr fields."
    return
print "<p>name:", form["name"].value
print "<p>addr:", form["addr"].value
#...further form processing here...
于 2010-03-22T06:19:22.790 に答える