6

我正在尝试使用 GET 向用户发送带有表单数据的简单 html 页面,然后使用 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'})

它似乎按您的预期工作。

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 字段存储:

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)

您遇到的问题,因为这是创建 Web 服务器应用程序的一种非常低级的方法,如果您从输入流中无限期地读取,它将继续运行并阻塞。您检查标头的内容长度并且只读取那么多字节。您根本不需要 cgi 模块,因为这不是 cgi 脚本。

cgi 脚本由服务器工作,看到请求是针对匹配类型和位置的文件,并像普通程序一样在子进程中执行它。它向进程提供参数,然后返回响应以发送回客户端。如果这是一个 cgi 脚本,那么服务器将在一个模块中,永远运行,而 cgi 代码将在另一个模块中,其中包含更简单的代码来检查请求。

于 2012-07-04T18:18:55.773 回答
0

这是在我的情况下获取 POST vars 的方法的 URL这里 详细解释由 JDI 提供。

于 2012-07-04T18:43:53.857 回答