15

これは非常に単純な質問に違いありませんが、私には理解できないようです。

私はapache+mod_wsgiを使用してPythonアプリケーションをホストしており、投稿コンテンツをいずれかの形式で送信したいのですが、環境値もsys.stdinにもこのデータは含まれていません。ちょっと手を貸してくれませんか?

編集:すでに試しました:

  • environ ["CONTENT_TYPE"] ='application / x-www-form-urlencoded'(データなし)
  • environ ["wsgi.input"]はもっともらしい方法のようですが、environ ["wsgi.input"]。read()とenviron ["wsgi.input"]。read(-1)の両方が空の文字列を返します(はい、コンテンツが投稿され、environ ["request_method"] = "post"
4

2 に答える 2

22

PEP 333は、environ['wsgi.input'] を読む必要があると言っています。

次のコードを保存して、Apache の mod_wsgi で実行させました。できます。

あなたは何か間違ったことをしているに違いありません。

from pprint import pformat

def application(environ, start_response):
    # show the environment:
    output = ['<pre>']
    output.append(pformat(environ))
    output.append('</pre>')

    #create a simple form:
    output.append('<form method="post">')
    output.append('<input type="text" name="test">')
    output.append('<input type="submit">')
    output.append('</form>')

    if environ['REQUEST_METHOD'] == 'POST':
        # show form data as received by POST:
        output.append('<h1>FORM DATA</h1>')
        output.append(pformat(environ['wsgi.input'].read()))

    # send results
    output_len = sum(len(line) for line in output)
    start_response('200 OK', [('Content-type', 'text/html'),
                              ('Content-Length', str(output_len))])
    return output
于 2008-12-27T01:22:33.457 に答える
14

wsgi.input で read() または read(-1) を呼び出すことは、たとえ Apache/mod_wsgi で許可されていても、技術的に言えば WSGI 仕様に違反していることに注意してください。これは、WSGI 仕様で有効な長さ引数を指定する必要があるためです。WSGI 仕様では、CONTENT_LENGTH で指定された以上のデータを読み取るべきではないとも述べています。

したがって、上記のコードは Apache/mod_wsgi では機能する可能性がありますが、移植可能な WSGI コードではなく、他の WSGI 実装では失敗します。正しくは、リクエストのコンテンツの長さを決定し、その値を read() に渡します。

于 2009-06-24T12:31:53.310 に答える