在Python中处理分块编码的HTTP POST请求(或Apache下的通用CGI)

5 投票
5 回答
5871 浏览
提问于 2025-04-11 09:36

我有一个j2me客户端,它会向一个网络服务器发送一些分块编码的数据。我想用Python来处理这些数据。这个脚本是作为CGI脚本运行的,但看起来Apache不允许对CGI脚本发送分块编码的POST请求。根据我看到的,mod_python、WSGI和FastCGI也不行。

我想知道有没有办法让Python脚本处理这种输入。我对任何建议都很开放(比如在apache2中设置一个配置,让它能组装这些块,或者一个独立的Python服务器来完成这个任务等等)。我在网上查了很多资料,但没有找到任何可用的解决方案,这真让人奇怪。

我知道如果在服务器端使用Java会是一个解决办法,但我实在想不出为什么用Apache和Python就不能解决这个问题。

5 个回答

2

我在使用Apache 2.2的mod_cgi时一切都很顺利,Apache会自动处理请求,把它们传递给CGI应用程序时,不会有任何问题。

不过,WSGI现在不允许使用分块请求,mod_wsgi确实会用一个411的响应来阻止这些请求。这个问题在WSGI 2.0的计划中。不过,恭喜你找到了一种可以处理分块请求的方式,我之前从没见过!

2

我建议你使用Twisted框架来搭建你的HTTP监听器。Twisted支持分块编码。

http://python.net/crew/mwh/apidocs/twisted.web.http._ChunkedTransferEncoding.html

希望这对你有帮助。

6

一年前,我也遇到了同样的问题,当时是一个J2ME客户端和一个Python/Ruby的后台在通信。我找到的唯一一个不需要对应用程序或基础设施进行大改动的解决办法,就是使用mod_proxy的一个相对不为人知的功能。

mod_proxy可以缓存进来的(分块的)请求,然后在将它们转发给后端代理之前,把这些请求重新组合成一个带有Content-Length头的单一请求。这个小技巧是,你可以创建一个非常简单的代理配置,把请求再发回同一个Apache服务器。也就是说,接收一个在80端口的分块请求,"解块"后,再把它转发到你在81端口的非HTTP 1.1兼容的服务器。

我在生产环境中使用这个配置超过一年,没有遇到任何问题。它的配置大致是这样的:

ProxyRequests Off

<Proxy http://example.com:81>
  Order deny,allow
  Allow from all
</Proxy>

<VirtualHost *:80>
  SetEnv proxy-sendcl 1
  ProxyPass / http://example.com:81/
  ProxyPassReverse / http://example.com:81/
  ProxyPreserveHost On
  ProxyVia Full

  <Directory proxy:*>
    Order deny,allow
    Allow from all
  </Directory>

</VirtualHost>

Listen 81

<VirtualHost *:81>
  ServerName example.com
  # Your Python application configuration goes here
</VirtualHost>

我在我的博客上详细写了这个问题和我的解决方案,感兴趣的话可以查看 这里

撰写回答