文件名 mypage.py
Python代码
form = cgi.FieldStorage()
name = form.getfirst('name', 'empty')
id = form.getfirst('id', 'empty')
print """\
Content-Type: text/html\n
<html>
<body>
<p>Name: "%s"</p>
<p>ID: "%s"</p>
</body>
</html>
""" % (name, id)
同一文件中的HTML
<form name="frm" method="post" action="mypage.py?id=33">
<input type="text" name="name" value="MyName" />
<input type="Submit" id="btn" value="Send" />
提交表单后(按“发送”按钮),我可以看到此URL带有以下输出
localhost:8000/cgi-bin/mypage.py?id=33
Name: "empty"
ID: "33"
如果我将表单方法POST更改为GET
<form name="frm" method="get" action="mypage.py?id=33">
然后我可以看到这个带有以下输出的URL
localhost:8000/cgi-bin/mypage.py?name=MyName
Name: "MyName"
ID: "empty"
我不明白为什么我没有使用POST方法接收文本字段值?为什么我无法使用GET方法在查询字符串中接收id值?
它没有任何框架的简单python页面。 BTW我使用的是从here下载的“python-bugzilla 0.8.0”,但我认为我给出的代码只是一个简单的页面,与此软件包无关。
任何帮助将不胜感激。
提前致谢,
答案 0 :(得分:1)
你的GET是正确的:
<form name="frm" method="get" action="mypage.py?id=33">
但你的帖子不是:
<form name="frm" method="post" action="mypage.py?id=33">
您无法在POST操作中添加GET样式变量(?id = 33)。它应该是:
<form name="frm" method="post" action="mypage.py">
<input type="hidden" name="id" value="33">
See HTTP Methods: GET vs. POST:&#34;查询字符串(名称/值对)在GET请求的URL中发送&#34;和&#34;查询字符串(名称/值对)在POST请求的HTTP消息体中发送&#34;。
不遵守这些规则会导致您所看到的意外结果。
答案 1 :(得分:1)
从技术上讲,POST
目标网址不应包含GET
个参数,因此目标中的?id=33
无效。我也猜测它对FieldStorage
模块造成了混淆,这可能就是你得到意想不到的结果的原因。
答案 2 :(得分:1)
你应该根据我的其他答案正确使用POST和GET。也就是说,我担心你使用form.getfirst和变量名。
FieldStorage.getfirst(name [,default]) - 此方法始终只返回与表单字段名称关联的一个值。如果在此类名称下发布了更多值,则该方法仅返回第一个值。
你已经命名了你的名字变量名,这是一个愚蠢的名字。看,很多名字。你的表格有一个名字。这是一个领域。与ID相同。您应该更改变量名称:
<form name="MyForm" method="post" action="mypage.py">
<input type="text" name="FullName" value="MyName" />
<input type="text" name="FormID" value="33" />
<input type="Submit" id="btn" value="Send" />
并按如下方式更改Python:
form = cgi.FieldStorage()
FullName = form.getfirst('FullName', 'empty')
FormID = form.getfirst('FormID', 'empty')
print """\
Content-Type: text/html\n
<html>
<body>
<p>Name: "%s"</p>
<p>ID: "%s"</p>
</body>
</html>
""" % (FullName, FormID)
这是适当的POST和打印变量的代码。它有效吗?
答案 3 :(得分:1)
感谢您的帮助。
问题在这里。
form = cgi.FieldStorage()
正如我在你的答案的评论中提到的,我已经打印了“表格”,这里输出:“FieldStorage(None,None,[])”。
因此,如果FieldStorage没有任何值,那么使用哪个函数来获取表单值并不重要。但这也是非常好的信息和实用性。
之前form = cgi.FieldStorage()
在另一个错误的函数中被声明,这就是FieldStorage为空的原因。
这是错误的代码。
def myfunction ():
cgitb.enable()
form = cgi.FieldStorage()
解决方案1:
form = cgi.FieldStorage()
应在run()函数内定义并将此表单作为其他函数的参数传递以获取表单的值。
即
def run():
cgitb.enable()
form = cgi.FieldStorage()
myfunction(form)
现在正在运作
def myfunction (form):
name = form.getfirst('name', 'empty')
id = form.getfirst('id', 'empty')
解决方案2:
form = cgi.FieldStorage()
应直接在main函数内定义,然后不需要将其作为参数传递
即
if __name__ == "__main__":
cgitb.enable()
form = cgi.FieldStorage()
现在它的工作也可以在myfunction中访问。
def myfunction ():
name = form.getfirst('name', 'empty')
id = form.getfirst('id', 'empty')
谢谢大家。