【问题标题】:Processing chunked encoded HTTP POST requests in python (or generic CGI under apache)在 python 中处理分块编码的 HTTP POST 请求(或 apache 下的通用 CGI)
【发布时间】:2010-09-22 00:49:47
【问题描述】:

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

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

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

【问题讨论】:

  • 我很乐意通过配置解决它,所以如果您知道在 apache 2(.2) 中设置什么以及如何设置,请告诉我。
  • 确实可以通过较小的配置更改来做到这一点。详情见我的回答。

标签: python http post java-me midlet


【解决方案1】:

一年前我遇到了完全相同的问题,一个 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>

我也有完整的问题记录和我的详细解决方案on my blog

【讨论】:

  • 我在 Ubuntu 8.04 / apache 2.2.8 上使用了相同的配置,但我在代理日志中收到此错误:[错误]代理:不支持分块传输编码
  • 博客链接已损坏
【解决方案2】:

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

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

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    Apache 2.2 mod_cgi 对我来说很好用,Apache 在请求被传递到 CGI 应用程序时会透明地取消分块。

    WSGI 当前不允许分块请求,而 mod_wsgi 确实会以 411 响应阻止它们。它在 WSGI 2.0 的绘图板上。但是恭喜你找到了可以执行块请求的东西,我以前从未见过!

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-08
          • 2011-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-18
          • 1970-01-01
          相关资源
          最近更新 更多