我在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程序尝试POST到该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()
答案 0 :(得分:1)
服务器端程序(您没有提供,所以我们无法确定)只接受GET请求而不是POST请求到显示的URL。
urllib让urlopen以你完成它的方式充当POST。有关如何发出GET请求
的示例,请参阅文档http://docs.python.org/2/library/urllib.html#examples答案 1 :(得分: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脚本。