Python中GET和POST方法的问题

时间:2013-08-29 16:29:02

标签: python html

文件名 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”,但我认为我给出的代码只是一个简单的页面,与此软件包无关。

任何帮助将不胜感激。

提前致谢,

4 个答案:

答案 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和变量名。

the documentation

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')

谢谢大家。