Уведомления

Группа в Telegram: @pythonsu

#1 Май 23, 2009 03:59:35

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

upload файлов на сервер

поставил Apache + mod_wsgi, разбираюсь как писать на Питоне под web. Покопался в коде стандартного модуля cgi. Появились вопросы.

В какой момент запускается питон-программа при upload-е файлов?
1. после загрузки всех файлов на сервер
2. после получения http-заголовков, но до того, как загрузится тело запроса

Тело запроса доступно через переменную окружения ‘wsgi.input’, которая ведет себя как файл.
В коде cgi данные читают из ‘wsgi.input’ порциями fp.readline(maxsize) и порциями записывают на диск в tempfile. В интернете пишут, что чтение порциями сделано в целях предотвращения DoS атаки, - если в теле http-запроса подсунут много мегабайт - environ.read() скушает всю память.

Однако, в таком коде:

form = cgi.FieldStorage()
f = form['uploaded_file'].value
вызывается метод __getattr__ класса FieldStorage:

def __getattr__(self, name):
if name != 'value':
raise AttributeError, name
if self.file:
self.file.seek(0)
value = self.file.read()
self.file.seek(0)
elif self.list is not None:
value = self.list
else:
value = None
return value
где файл из temp-а целиком загружается в память self.file.read(), - чего так боялись вначале.
Сразу вопрос - где логика?

А что если послать много мегабайт текста обычным POST-ом (enctype=“application/x-www-form-urlencoded”)? cgi запустит метод read_urlencoded(), где первой строкой прочитает тело запроса в память qs = self.fp.read(self.length). Про ограничение размера POST-данных в документации ни слова.
Ну и где логика?

Появились вопросы.
В PHP есть файл настроек интерпретатора - php.ini, в котором можна установить максимальный размер POST-данных (post_max_size) и максимальный размер закачиваемого файла (upload_max_filesize). Есть ли какой-то аналог в Питоне? Настраиваются ли эти параметры на уровне веб-сервера? Или эти параметры нужно контролировать в программе?



Офлайн

#2 Май 24, 2009 02:31:37

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

upload файлов на сервер

если вам ближе php - зачем вам мучаться с этим чёртовым питоном?)

вообще от cgi вы много хотите, да и это старо как мир;)
первое решение от гугла на базе генератора http://webpython.codepoint.net/cgi_big_file_upload (как видно из кода работают с form.file, а не с value)

“ограничение POST-данных” - это “проблемы” сервера.

Офлайн

#3 Май 24, 2009 04:51:57

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

upload файлов на сервер

slav0nic
если вам ближе php - зачем вам мучаться с этим чёртовым питоном?)
После знакомства с Питоном на PHP писать стало противно :)
Вначале цель была - десктоп-приложения, теперь, очевидно, нужно разбираться с web-ом.

slav0nic
вообще от cgi вы много хотите, да и это старо как мир
может быть, но библиотеку везде используют - в том же Джанго gjango/http/multipartparser.py первая строка import cgi, в библиотеке webob, которую использует Google App Engine тоже import cgi :)

Посмотрел код по ссылке - там идея - закачать большой файл, обойдя ограничение по оперативной памяти на сценарий.
Для такой закачки нужно увеличить лимиты веб-сервера на размер закачиваемого файла и общий размер тела POST-запроса. Отсюда лазейка - формы с enctype=“application/x-www-urlencoded” парсят с помощью cgi.parse_qs(), который сразу считывает тело POST-запроса в память. Если злобный дядя прикинется формой и пошлет в теле 100 Мб данных, - метод попытается их прочитать в строку, но упрется в ограничение веб-сервера по оперативной памяти для сценария. Для PHP обычно 16-32 Мб, на Питоне наверно цифры похожие.

Я правильно понимаю, что веб-сервер в таком случае убьет процесс или поток, и ничего страшного не произойдет?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version