web-dev-qa-db-ja.com

アクセスPOST WSGIからのデータ

WSGIを使用してPOSTデータにアクセスする方法がわかりません。 wsgi.orgウェブサイトで例を試しましたが、うまくいきませんでした。現在Python 3.0を使用しています。 WSGIフレームワークは私が探しているものではないため、お勧めしません。

それをfieldstorageオブジェクトに取り込む方法を理解したいと思います。

34
Evan Fosmark

POSTデータをFieldStorageオブジェクトに取得しようとしていると仮定します。

# env is the environment handed to you by the WSGI server.
# I am removing the query string from the env before passing it to the
# FieldStorage so we only have POST data in there.
post_env = env.copy()
post_env['QUERY_STRING'] = ''
post = cgi.FieldStorage(
    fp=env['wsgi.input'],
    environ=post_env,
    keep_blank_values=True
)
29
Mike Boers
body= ''  # b'' for consistency on Python 3.0
try:
    length= int(environ.get('CONTENT_LENGTH', '0'))
except ValueError:
    length= 0
if length!=0:
    body= environ['wsgi.input'].read(length)

WSGIはまだ完全に指定されていないことに注意してくださいPython 3.0、および人気のあるWSGIインフラストラクチャの多くは変換されていません(または2to3dになっていますが、適切にテストされていません)(wsgiref.simple_serverでも)実行されません。)今日、3.0でWSGIを実行するのはおおよその時間です。

22
bobince

これは私のために働きました(Python 3.0):

import urllib.parse

post_input = urllib.parse.parse_qs(environ['wsgi.input'].readline().decode(),True)
5
Jack

さらに短い

l = int(env.get('CONTENT_LENGTH')) if env.get('CONTENT_LENGTH') else 0
body = env['wsgi.input'].read(l) if l > 0 else ''

このコードは本番環境で機能します。

3
ansi_lumen

例として、いくつかのフレームワークがそれをどのように行うかを見てみることをお勧めします。 (1つをお勧めするのではなく、例として使用します。)

これが Werkzeug のコードです。

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/wrappers.py#L15

呼び出す

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/utils.py#L142

ここで要約するのは少し複雑なので、説明しません。

0
Ali Afshar