0

我在 Python 中运行本地 CGIHttpServer,并且正在使用这个 python 程序在该服务器中运行一些东西:

''' submit data to form using robots '''
import urllib
import pprint


# hacking gullible app
url = "http://localhost:8000/cgi-bin/w5/captcha.example/vote_app/gullible_app.py"

def vote(lecturer):
    params = urllib.urlencode({'lecturer': lecturer,'submit':'submit'})
    f = urllib.urlopen(url, params)
    pprint.pprint(f.fp.readlines())

vote("Ivo")

这告诉我它只能 POST 到 CGI 脚本,我觉得这很奇怪,因为 python 脚本在我的网络浏览器中打开该地址就好了。所以......它在我的浏览器中运行良好,但当 python 程序尝试发布到该 URL 时却没有。这里发生了什么?(互联网上关于这个的信息很少——我已经尝试自己研究这个问题来解决它,但只有 3-4 人提到这个问题)

编辑:对不起,伙计们!我不明白 GET 和 POST。我应该在问题中包含这个 - 它是 python 程序“gullible_app.py”。如您所见,表单执行“POST”操作

import cgi
import cgitb; cgitb.enable()

# form generation
# -------------------------------------------------------
def print_form():
    print "Content-Type: text/html\n"
    print '''
<html>
<body>
    <form method="post" action="gullible_app.py">
        <p>Select your favorite lecturer:</p>
        <input type="radio" name="lecturer" value="harald" /> Harald
        <input type="radio" name="lecturer" value="ivo" /> Ivo
        <input type="submit" name="submit" />
    </form>
</body>
</html>
'''

# response generation
# -------------------------------------------------------
def print_response():
    print 'Content-Type: text/html\n'
    print '<html><body>Thank you for your vote!</body></html>'

def main():
    user_data = cgi.FieldStorage()
    if "submit" in user_data: # user press "submit"
        lecturer = user_data.getfirst("lecturer")
        f = open( "cgi-bin\\w5\\captcha.example\\vote_app\\votes.txt", "a" )
        f.write( lecturer+'\n' )
        f.close()
        print_response()
    else: # display the form
        print_form()

main()
4

2 回答 2

1

服务器端程序(你没有给出,所以我们不能肯定地说)只接受 GET 请求,而不接受对所示 url 的 POST 请求。

urllib 使 urlopen 像您所做的那样充当 POST。有关如何发出 GET 请求的示例,请参阅文档http://docs.python.org/2/library/urllib.html#examples

于 2013-04-17T07:01:20.253 回答
0

答案似乎在文档中。

您的错误信息:Error 501, “Can only POST to CGI scripts”, is output when trying to POST to a non-CGI url.

大提示:run the CGI script, instead of serving it as a file, if it guesses it to be a CGI script

您需要修改的内容:cgi_directories

因此,要么将您的(Python)CGI 脚本放在默认子目录之一中,要么修改它cgi_directories以使其正确“猜测”该 URL 应该是 CGI 脚本。

于 2013-04-17T06:58:31.623 回答