不能与cgi.FieldStorage得到POST值(Cannot get POST values

2019-07-30 05:55发布

我真的想与表单数据发送简单的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(),浏览器卡住,看起来像脚本正在等待数据流的结束。 从我应该采取I`M与POST提交名称变量?

Answer 1:

我想你可能会在这里混合了一些概念。 你有一台服务器的两个想法,也是一个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)

这个问题你有,因为这是一个非常低的水平的方式来创建Web服务器应用程序,如果从输入流中读取下去,它会继续下去,块。 您检查头的内容长度和只读很多字节。 你没有任何必要在所有CGI模块,因为这不是一个CGI脚本。

CGI脚本工作由服务器看到请求是匹配的类型和位置的文件,并在像一个正常的程序的子进程执行它。 它滋生的过程中ARGS,然后回来船返回给客户端的响应。 如果这是一个CGI脚本,服务器会在一个模块中,运行下去,而CGI代码将是另一个具有更简单的代码来检查请求。



Answer 2:

在最初的代码中,我只是改变了线

form = cgi.FieldStorage()

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

它似乎在按预期工作。

帽尖http://pymotw.com/2/BaseHTTPServer/为临界“ENVIRON”设置。 (默认情况下,cgi.FieldStorage认为它在处理一个GET请求。)



Answer 3:

这里是为方针,以获得POST我的情况瓦尔URL 这里详细解释由JDI提供。



文章来源: Cannot get POST values with cgi.FieldStorage
标签: python http