我试图通过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>
Run Code Online (Sandbox Code Playgroud)
这是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())
Run Code Online (Sandbox Code Playgroud)
但FieldStorage一直都是空的.我已经尝试检查self.rfile中的内容,并发现如果我尝试执行self.rfile.readlines(),浏览器卡住并看起来像脚本正在等待数据流的结束.我应该从哪里采取我用POST提交的Name变量?
Mic*_*yck 12
在原始代码中,我只是更改了行
form = cgi.FieldStorage()
Run Code Online (Sandbox Code Playgroud)
至
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD':'POST'})
Run Code Online (Sandbox Code Playgroud)
它似乎按你的意图工作.
对于关键的"环境"设置,请访问http://pymotw.com/2/BaseHTTPServer/.(默认情况下,cgi.FieldStorage认为它正在处理GET请求.)
我想你可能会在这里混合一些概念.你既有服务器的想法,也有cgi脚本.无论您的POST操作是什么(http.py或其他),您的服务器都将接收请求.实际上没有CGI处理.因此,为了简单起见,您可以先将html模板调整为此:
<form method="post" action="">
Run Code Online (Sandbox Code Playgroud)
然后,您应该参考另一个关于如何从请求中读取的问题,而不是尝试使用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)
Run Code Online (Sandbox Code Playgroud)
您遇到的问题,并且因为这是创建Web服务器应用程序的一种非常低级的方式,如果您无限期地从输入流中读取它,它将继续运行并阻止.检查内容长度的标头,只读取那么多字节.您根本不需要cgi模块,因为这不是cgi脚本.
cgi脚本由服务器工作,看到请求是针对匹配类型和位置的文件,并在子进程中执行它,就像普通程序一样.它为args提供进程,然后返回响应以返回给客户端.如果这是一个cgi脚本,服务器将在一个模块中,永远运行,而cgi代码将在另一个模块中使用更简单的代码来检查请求.
| 归档时间: |
|
| 查看次数: |
13734 次 |
| 最近记录: |