Ошибки обработчика выгрузки файлов Django - PullRequest
2 голосов
/ 05 августа 2009

В Django я хочу прекратить загрузку файлов, которые не заканчиваются на указанном мной расширении, как только они будут получены. Для этого я определяю собственный обработчик загрузки и пишу new_file, чтобы он выглядел примерно так:

def new_file(self, field_name, file_name, content_type, content_length, charset=None):
    basename, extension = os.path.splitext(file_name)
    if extension != ".txt":
        raise StopUpload(True) # Error: Only .txt files are accepted

Это прекрасно работает для остановки загрузки, но также очищает запрос. ФАЙЛЫ. Теперь, когда мое представление получает запрос, он не может определить, вызвал ли обработчик загрузки файл, и я не могу отобразить полезное сообщение для пользователя.

Можно ли каким-либо образом распространять сообщения из обработчика загрузки в соответствующее представление, чтобы я мог отобразить ошибку пользователю? Я пытался использовать объект запроса, но он неизменен.

1 Ответ

4 голосов
/ 05 августа 2009

Я нашел причину, почему я не мог заставить ее работать, и решение а также.

Похоже, что Django использует ленивую оценку для запроса. определить, когда вызывается обработчик загрузки. Поэтому загрузка обработчик вызывается только тогда, когда вы пытаетесь получить доступ request.FILES. Кроме того, объект запроса, который я использую (WSGIRequest в моем случае) сделал неизменными словари GET и POST, поэтому мы не можем передавать туда информацию. Тем не менее, МЕТА все еще доступны для добавления информации.

Мое объединенное решение имеет строку "request.FILES" в представлении, что обрабатывает загрузку, которая заставляет обработчик загрузки начинаться. Когда ошибка фиксируется в new_files, я устанавливаю self.request.META ['error'] в сообщение об ошибке и поднять StopUpload, что толкает нас обратно в просмотр без файла. Наконец, я проверяю request.META ['error'] в просмотреть и отобразить это сообщение при возникновении проблемы.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...