【问题标题】:Handle the HTTP PUT method in Python WSGI在 Python WSGI 中处理 HTTP PUT 方法
【发布时间】:2011-01-09 22:58:53
【问题描述】:

我目前有一个 bash 应用程序,除其他外,它使用 cURL 通过 PUT 方法将文件上传到 Web 应用程序。我试图复制 Web 应用程序,因为客户端(bash)部分是 GPL,但 Web 部分不是。我也无法更改客户端应用程序,因为它会从开发人员的网站自动更新。 我找到了大量关于如何使用 WSGI、CherryPy、Twisted 处理 HTTP POST 方法的信息,以及几乎所有在 WWW 上运行 Python 脚本的方法。但是,我找不到关于 PUT 方法的任何内容。有谁知道如何使用 WSGI 处理 PUT 请求,或者是否有其他一些我缺少的具有 PUT 功能的框架?

【问题讨论】:

  • 这真的取决于您使用的框架。例如,对于 django,您检查 request.method,并查看它是“PUT”、“POST”、“GET”、“DELETE”还是其他任何内容。
  • 不幸的是,我正在复制其服务器端的应用程序需要使用各种不同的 HTTP 状态代码,无论它们是否真的有意义,但大多数情况下没有——bash客户端只是用cut从响应头中提取代码——因此Django太低级了。

标签: python http wsgi put


【解决方案1】:

据我了解,您只想读取流environ['wsgi.input'],因为PUT 请求会将PUT 的全部内容作为请求的主体发送。

我不知道您必须处理任何编码问题(除了它是二进制的事实)。

前段时间,我编写了一组简单的 PHP 脚本,用于从 LAN 上的另一台服务器获取和提供大量文件。我们从 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 中使用 POST 处理 multipart/form-data 的经验,我毫不怀疑您可以通过读取输入流来处理 PUT

python代码应该是这样的:

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

【讨论】:

  • 哇,我不知道 PUT 在这方面与 POST 如此相似!我马上试试这个。
  • 嗯...最好明天再做。无意冒犯您,刚刚出现了另一项优先于此任务的任务。
猜你喜欢
  • 2017-04-03
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 2014-12-23
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多