В какой момент запускается питон-программа при 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
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
Сразу вопрос - где логика?
А что если послать много мегабайт текста обычным 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). Есть ли какой-то аналог в Питоне? Настраиваются ли эти параметры на уровне веб-сервера? Или эти параметры нужно контролировать в программе?