Обрабатывать метод HTTP PUT в Python WSGI - PullRequest
2 голосов
/ 10 января 2011

В настоящее время у меня есть приложение bash, которое, помимо прочего, использует cURL для загрузки файла в веб-приложение методом PUT. Я пытаюсь продублировать веб-приложение, поскольку клиентская (bash) часть - это GPL, а веб-часть - нет. Я также не могу изменить клиентское приложение, поскольку оно самообновляется с веб-сайта разработчиков. Я нашел множество информации о том, как обрабатывать метод HTTP POST с WSGI, CherryPy, Twisted и практически обо всех способах работы скриптов Python в WWW. Однако я не могу найти ничего о методе PUT . Кто-нибудь знает, как обрабатывать запрос PUT с помощью WSGI, или мне не хватает какой-то другой инфраструктуры с функциями PUT?

1 Ответ

3 голосов
/ 10 января 2011

Насколько я понимаю, вы просто захотите прочитать поток environ['wsgi.input'], потому что запрос PUT отправит все содержимое 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);

Из моего опыта работы с multipart/form-data в WSGI с POST я не сомневаюсь, что вы можете обработать PUT, просто прочитав входной поток.

Код Python должен быть таким:

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