在Python WSGI中处理HTTP PUT方法
我现在有一个用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-data
和 POST
的经验,我几乎可以肯定你可以通过读取输入流来处理 PUT
请求。
Python 代码应该是这样的:
output = open('/tmp/input', 'wb')
while True:
buf = environ['wsgi.input'].read(4096)
if len(buf) == 0:
break
output.write(buf)