4

文件名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 页面没有任何框架。顺便说一句,我正在使用从这里下载的“python-bugzilla 0.8.0”,但我认为我给定的代码只是一个简单的页面,与这个包无关。

任何帮助,将不胜感激。

提前致谢,

4

4 回答 4

1

您的 GET 是正确的:

<form name="frm" method="get" action="mypage.py?id=33">

但是您的 POST 不是:

<form name="frm" method="post" action="mypage.py?id=33">

您不能将 GET 样式变量 (?id=33) 添加到 POST 的操作中。它应该是:

<form name="frm" method="post" action="mypage.py">
<input type="hidden" name="id" value="33">

请参阅 HTTP 方法:GET 与 POST:“查询字符串(名称/值对)在 GET 请求的 URL 中发送”和“查询字符串(名称/值对)在 POST 请求的 HTTP 消息正文中发送” .

不遵守这些规则会导致您所看到的意外结果。

于 2013-08-29T17:10:40.030 回答
1

从技术上讲,POST目标 url 不应该有GET参数,因此?id=33目标中的 是无效的。我也猜测它对FieldStorage模块感到困惑,这可能就是你得到意想不到的结果的原因。

于 2013-08-29T17:11:34.070 回答
1

根据我的其他答案,您应该正确使用 POST 和 GET 。也就是说,我担心您使用 form.getfirst 和变量名。

根据文档

FieldStorage.getfirst(name[, default]) - 此方法始终只返回一个与表单字段 name 关联的值。该方法仅返回第一个值,以防在该名称下发布了更多值

你命名了你的名字变量名,这是一个愚蠢的名字。看,很多名字。你的表格有一个名字。这是一个领域。和身份证一样。您应该这样更改变量名称:

<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 和打印变量的代码。它有效吗?

于 2013-08-29T18:08:05.260 回答
1

谢谢您的帮助。

问题就在这里。

form = cgi.FieldStorage()

正如我在您的答案评论中提到的那样,我已经打印了“表单”,这里是输出:“FieldStorage(None, None, [])”。

因此,如果 FieldStorage 没有任何值,那么使用哪个函数来获取表单值并不重要。但这确实是很好的信息,也很实用。

之前form = cgi.FieldStorage()在另一个错误的函数中声明,这就是 FieldStorage 为空的原因。

这是错误的代码。

def myfunction ():
    cgitb.enable()
    form = cgi.FieldStorage()

解决方案1:

form = cgi.FieldStorage()应在 run() 函数内部定义并将此表单作为其他函数的参数传递以获取表单的值。
IE

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()应直接在主函数内部定义,然后不需要将其作为参数传递。
IE

if __name__ == "__main__":
    cgitb.enable()
    form = cgi.FieldStorage()

现在它也可以工作了,并且可以在 myfunction 中访问表单。

def myfunction ():
    name = form.getfirst('name', 'empty')
    id   = form.getfirst('id', 'empty')

谢谢大家。

于 2013-08-30T07:09:35.900 回答