6

フォームデータを含む単純なhtmlページをGETを使用してユーザーに送信し、POSTを使用してフォームから変数を受信しようとしています。HTMLファイルは次のようになります。

<HTML>
<title> My Title</title>
<body>
<form  method="post" action="http.py">
<input name="Name" type="text"/>
<input name="Submit" type="submit" value="Submit" />
</form>
</body>
</HTML>

Pythonスクリプトは次のとおりです。

import os
import cgi
import sys
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler



class customHTTPServer(BaseHTTPRequestHandler):
        def do_GET(self):
                self.send_response(200)
                self.send_header('Content-type', 'text/html')
                self.end_headers()
                fh=open('index.html','r')
                self.wfile.write(fh.read())
                return

        def do_POST(self):
            form = cgi.FieldStorage()
            self.send_response(200)
            self.end_headers()
            self.wfile.write(form['Name'].value)


def main():
       try:
            server = HTTPServer(('',9111),customHTTPServer)
            print 'server started at port 8080'
            server.serve_forever()
       except KeyboardInterrupt:
            server.socket.close()

if __name__=='__main__':
       sys.exit(main())

ただし、FieldStorageは常に空のままです。私はすでにself.rfileの内容を確認しようとしましたが、self.rfile.readlines()を実行しようとすると、ブラウザーがスタックし、スクリプトがデータストリームの終了を待機しているように見えることがわかりました。POSTで送信するName変数をどこから取得する必要がありますか?

4

3 に答える 3

13

元のコードでは、行を変更しただけです

form = cgi.FieldStorage()

form = cgi.FieldStorage(
    fp=self.rfile,
    headers=self.headers,
    environ={'REQUEST_METHOD':'POST'})

意図したとおりに機能しているようです。

重要な「environ」設定については、http://pymotw.com/2/BaseHTTPServer/へのヒント。(デフォルトでは、cgi.FieldStorageはGETリクエストを処理していると見なします。)

于 2014-08-02T05:27:20.313 に答える
6

ここでいくつかの概念を混ぜているのではないかと思います。サーバーとcgiスクリプトの両方のアイデアがあります。POSTアクション(http.pyなど)に関係なく、サーバーはリクエストを受け取るだけです。CGI処理は実際には発生していません。したがって、簡単にするために、最初にhtmlテンプレートをこれに調整できます。

<form  method="post" action="">

次に、 cgi fieldstorageを使用しようとするのではなく、リクエストから読み取る方法に関するこの他の質問を参照する必要があります。

import urlparse

...

    def do_POST(self):
        length = int(self.headers.getheader('content-length'))
        postvars = urlparse.parse_qs(self.rfile.read(length), keep_blank_values=1)
        self.send_response(200)
        self.end_headers()
        self.wfile.write(postvars)

あなたが抱えていた問題、そしてこれはウェブサーバーアプリを作成するための非常に低レベルの方法であるため、入力ストリームから無期限に読み取ると、それは継続してブロックされます。ヘッダーのコンテンツの長さを確認し、そのバイト数のみを読み取ります。これはcgiスクリプトではないため、cgiモジュールはまったく必要ありません。

cgiスクリプトはサーバーによって機能し、要求が一致するタイプと場所のファイルに対するものであることを確認し、通常のプログラムのようにサブプロセスで実行します。プロセスに引数をフィードしてから、応答を返してクライアントに返送します。これがcgiスクリプトの場合、サーバーは1つのモジュールにあり、永久に実行され、cgiコードは別のモジュールにあり、要求をチェックするためのはるかに単純なコードになります。

于 2012-07-04T18:18:55.773 に答える
0

これが私の場合のPOST変数を取得するためのアプローチのURLです 。詳細な説明はJDIによって提供されます

于 2012-07-04T18:43:53.857 に答える