在Python WSGI中处理HTTP PUT方法

3 投票
1 回答
3111 浏览
提问于 2025-04-16 09:40

我现在有一个用bash写的应用程序,它用cURL这个工具通过PUT方法把文件上传到一个网页应用。现在我想复制这个网页应用,因为客户端(bash部分)是GPL开源的,但网页部分不是。我也不能修改客户端应用,因为它会自动从开发者的网站更新。
我找到很多关于如何用WSGI、CherryPy、Twisted等处理HTTP POST方法的信息,几乎涵盖了所有让Python脚本在网上运行的方法。但是,我找不到关于PUT方法的任何资料。有没有人知道如何用WSGI处理PUT请求,或者有没有其他我遗漏的支持PUT功能的框架?

1 个回答

4

根据我的理解,你只需要读取流 environ['wsgi.input'],因为一个 PUT 请求会把所有内容作为请求的主体发送过来。

我不知道你需要处理什么编码问题(除了它是二进制的这一点)。

之前我写过一组简单的 PHP 脚本,用来从局域网的另一台服务器传输大文件。我们开始时用的是 POST,但在处理较大的文件时很快就耗尽了内存。所以我们改用了 PUT,这样 PHP 脚本可以慢慢地每次读取 php://input 中的 4096 字节(或者其他大小)……这样效果很好。

以下是 PHP 代码:

$f1 = fopen('php://input', 'rb');
$f2 = fopen($FilePath, 'wb');

while($data = fread($f1, 4096))
{
    fwrite($f2, $data);
}

fclose($f1);
fclose($f2);

根据我在 WSGI 中处理 multipart/form-dataPOST 的经验,我几乎可以肯定你可以通过读取输入流来处理 PUT 请求。

Python 代码应该是这样的:

  output = open('/tmp/input', 'wb')
  while True:
    buf = environ['wsgi.input'].read(4096)
    if len(buf) == 0:
      break
    output.write(buf)

撰写回答