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

时间:2008-11-12 17:50:30

标签: python http post java-me midlet

我有一个j2me客户端会将一些分块编码数据发布到网络服务器。我想在python中处理数据。该脚本作为CGI运行,但显然apache将拒绝对CGI脚本进行分块编码的post请求。据我所知,mod_python,WSGI和FastCGI也没有。

我想知道是否有办法让python脚本处理这种输入。我对任何建议都持开放态度(例如apache2中的混淆设置可以组装块,一个独立的python服务器也可以做同样的事情等等。)我做了很多google搜索并没有找到任何可用的东西,这是很奇怪。

我知道在服务器端使用java会是一个解决方案,但我无法想象用apache + python无法解决这个问题。

5 个答案:

答案 0 :(得分:6)

一年前我遇到了一个完全相同的问题,J2ME客户端与Python / Ruby后端交谈。我发现需要应用程序或基础架构级别更改的唯一解决方案是使用mod_proxy的相对未知的功能。

Mod_proxy能够缓冲传入(分块)请求,然后在将它们传递给代理后端之前将它们重写为具有Content-Length头的单个请求。巧妙的诀窍是,您可以创建一个微小的代理配置,将请求传递回同一个Apache服务器。即在端口80上获取传入的chunked请求,“dechunk”它,然后将其传递到端口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>

我也完整地写了这个问题,我的解决方案详细on my blog

答案 1 :(得分:2)

我会说使用扭曲的框架来构建你的http监听器。 Twisted支持分块编码。

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

希望这有帮助。

答案 2 :(得分:2)

Apache 2.2 mod_cgi对我来说很好,Apache在传递给CGI应用程序时透明地解除了请求。

WSGI目前不允许分块请求,mod_wsgi确实用411响应阻止了它们。它是WSGI 2.0的绘图板。但是祝贺找到了一些可以满足需求的东西,我以前从未见过它!

答案 3 :(得分:2)

你不能用mod_python做你想做的事。如果您使用的是3.0版,则可以使用mod_wsgi执行此操作。但是,您必须跳出WSGI 1.0规范,因为WSGI有效地禁止了分块请求内容。

http://code.google.com/p/modwsgi/wiki/ChangesInVersion0300中搜索WSGIChunkedRequest以了解所需内容。

答案 4 :(得分:1)

可能是配置问题? Django可以通过mod_python,WSGI和FastCGI与Apache对接,它可以接受文件上传。