无法从python CGI发送POST请求。为什么?

时间:2014-12-06 06:45:55

标签: python apache post cgi

以下是我认为应该发送的内容:

POST /cgi-bin/testscript.py HTTP 1.1
Host: www.someplace.com
Content-Length: 50
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

bleeple=yes&rjunk=0%21603567240941&dummy=certainly

但是如果我把它放在STDIO上,那么当我发送POST行时,apache会抱怨头部无效。当然,它不是标题,而是前面的请求。所以,好吧,不是标题。

显然,apache正在构建该请求并将其发送给我,因为如果我发送GET,就像这样......

Location: http://www.someplace.com/cgi-bin/testscript.py?foo=bar

...然后apache(必须!?)先发出这个......

GET /cgi-bin/testscript.py HTTP 1.1

...对吧?那么如何让它为我的标题构建以下前缀呢?

POST /cgi-bin/testscript.py HTTP 1.1

如果我发送帖子行,那么它不知道脚本在哪里,并且我看不到任何反应。

如果我删除了POST行并添加了一个带有完整URL的Location:标题,那么冲浪者的浏览器会一直到那里,但没有选择POST数据。

我一直在搜索,直到我半盲,似乎无法找到答案,如何从CGI发出正确的POST,以响应从某个表单调用该CGI的人。

当然,这个(GET)工作得很好,除了它暴露了浏览器的URL栏中的params,我试图避免:

Location: http://www.someplace.com/cgi-bin/testscript.py?bleeple=yes&rjunk=0%21603567240941&dummy=certainly

我想在最基本的级别上执行此操作,除了我的apache服务器之外什么都没有。我可以用GET和STDIO来做。我可以发送HTTP页面,图像等。但POST?否。

我必须遗漏一些基本的东西 - 显然我的google-fu最弱。或者其他的东西。帮助

1 个答案:

答案 0 :(得分:0)

解释你想要做的事情是完全相关的,因为我现在理解这个问题,而我之前没有。

正如我在评论中所说,你输入与输出混淆:只是在你的回复开头放“POST”并不会以某种方式发布到另一个URL。您需要在脚本本身内实际发布帖子,例如使用stdlib或第三方urllib库中的requests模块。

但此时你需要问问自己为什么要使用CGI。除了非常简单的脚本之外,在2014年做这件事并不是一件明智的事情:我们有一个适当的技术可以将更复杂的应用程序与Web连接起来,它被称为WSGI。使用像Flask这样的微框架,然后你可以更简单地实现你想要的东西:在Flask中轻松敲击你的2,3和4脚本只是作为函数,并且原始脚本调度到相关的。这更有意义,因为只需要一个HTTP请求,并且所有这些都是在同一个过程中完成的。