1

私はWSGIを使用しており、次のコードを使用してget/postデータにアクセスしようとしています:

import os
import cgi
from traceback import format_exception
from sys import exc_info

def application(environ, start_response):

    try:
        f = cgi.FieldStorage(fp=os.environ['wsgi.input'], environ=os.environ)
        output = 'Test: %s' % f['test'].value
    except:
        output = ''.join(format_exception(*exc_info()))

    status = '200 OK'
    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

ただし、次のエラーが表示されます。

Traceback (most recent call last):
  File "/srv/www/vm/custom/gettest.wsgi", line 9, in application
    f = cgi.FieldStorage(fp=os.environ['wsgi.input'], environ=os.environ)
  File "/usr/lib64/python2.4/UserDict.py", line 17, in __getitem__
    def __getitem__(self, key): return self.data[key]
KeyError: 'wsgi.input'

私のバージョンには wsgi.input が存在しないからでしょうか?

4

1 に答える 1

7

WSGI APIを誤用しています。

コードにコメントできるように、このエラーを表示する最小限の ("hello world") 関数を作成してください。[アプリケーション全体を投稿しないでください。大きすぎて扱いにくく、コメントできない場合があります。]

は、os.environ使用すべきものではありません。WSGI はこれを強化された環境に置き換えます。WSGI アプリケーションは 2 つの引数を取得します。1 つは を含む辞書です'wsgi.input'


あなたのコードでは...

def application(environ, start_response):

    try:
        f = cgi.FieldStorage(fp=os.environ['wsgi.input'], environ=os.environ)

WSGI API 仕様 ( http://www.python.org/dev/peps/pep-0333/#specification-details ) に従って、 を使用しないでくださいos.environ。アプリケーションへの最初の位置パラメータである を使用environします。

環境パラメーターは、CGI スタイルの環境変数を含む辞書オブジェクトです。このオブジェクトは組み込みの Python ディクショナリ (サブクラス、UserDict、またはその他のディクショナリ エミュレーションではありません) である必要があり、アプリケーションはディクショナリを任意の方法で変更できます。ディクショナリには、特定の WSGI 必須変数 (後のセクションで説明) も含める必要があり、以下で説明する規則に従って命名されたサーバー固有の拡張変数も含めることができます。

于 2009-09-17T20:11:33.013 に答える