2011-09-27 2 views
1

私の(ダム)問題に対する解決策を見つけ、それを以下に挙げました。なぜenviron ['QUERY_STRING']は長さゼロの文字列を返しますか?

私はUbuntu 11.04でPython 2.7.1+を使用しています。クライアント/サーバーは同じコンピュータ上にあります。

ウィングデバッガから、私はサーバーコードが呼び出されていることを知っており、コードを一度に1行ずつ歩くことができます。この例では、私は22バイトが転送されたことを知っています。 Firebugので

、私はネットポストタブの下で、このデータを見た:

Parameter application/x-www-form-urlencoded 
fname first 
lname last 
Source 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 22 fname=first&lname=last 

これは私が使用しているクライアントのコードです:

<html> 
    <form action="addGraphNotes.wsgi" method="post"> 
     First name: <input type="text" name="fname" /><br /> 
     Last name: <input type="text" name="lname" /><br /> 
     <input type="submit" value="Submit" /> 
    </form> 
</html> 

そして、これはサーバコードです:

import urlparse 

def application(environ, start_response): 
    output = [] 

    # the environment variable CONTENT_LENGTH may be empty or missing 
    try: 
    # NOTE: THIS WORKS. I get a value > 0 and the size appears correct (22 bytes in this case) 
     request_body_size = int(environ.get('CONTENT_LENGTH', 0)) 
    except (ValueError): 
     request_body_size = 0 

    try: 
     # environ['QUERY_STRING'] returns "" 
     **values = urlparse.parse_qs(environ['QUERY_STRING'])** 
    except: 
     output = ["parse error"] 

ウィングデバッガでは、クライアントからサーバーにデータが渡されていることを確認しました。

>>> environ['wsgi.input'].read() 
'fname=first&lname=last' 

私の問題が見つかりました。私は間違った形でコピーして書きました。これは私がフォームを使用していたコードですが、私はAJAXを使い始めたときにフォームを使用して停止しました。さて、すべてがうまくいっています。

# When the method is POST the query string will be sent 
# in the HTTP request body which is passed by the WSGI server 
# in the file like wsgi.input environment variable. 
request_body = environ['wsgi.input'].read(request_body_size) 

values = parse_qs(request_body) 
+0

あなたは 'environ'ディクテーション全体を印刷しようとしましたか? –

+0

詳細については、編集した質問を参照してください。 – Jarek

答えて

3

あなたはQUERY_STRINGが実際にそれがGETリクエストのクエリ文字列を表して、空であることを行っているので(それはまた、他の要求タイプに表示されますが、それは時の問題とは無関係なのですPOSTクエリをやっていますハンド)。 wsgi.inputストリームを消費して、POSTのデータを解析することになっています。

+0

私は「取得」しようとしましたが、何も変わっていませんでした。先ほど書いた私の他のフォーム/サブミットコードはすべて 'post'を使っていて、コードはうまくいきました。このマシンで何かが「壊れている」ように見えますが、私はそれが何であるか把握できません。 – Jarek

+0

私は自分のフォームで投稿を使用してきましたが、すべてがうまくいきました。私がこのコンピュータを使用するまでは。 – Jarek

関連する問題