Какая альтернатива функции yield в Django? - PullRequest
0 голосов
/ 01 марта 2011

Функция yield передает поток в браузер, т. Е. Добавляет значение к ответу.

Мое требование состоит в том, чтобы вместо «добавления» существовала встроенная функция, которая перезаписывает старое значение, или просто скажите, не добавляет новое значение к старому ..?

Чтобы объяснить мое требование:

следующая функция в моем "views.py":

def handle_uploaded_file(f):
    filename = "/media/Data/static/Data/" + f.name
    uploaded = 0
    perc = 0.0
    filesize = f.size
    destination = open(filename, 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
        uploaded = uploaded + len(chunk)
        yield(str((uploaded * 100) / filesize) + "% ")
    destination.close()
    yield(f.name + " (" + str(round(f.size/1024.0, 2)) + " KB) uploaded successfully.")

Ниже приведен вывод вышеуказанной функции:

2% 4% 7% 9% 11% 14% 16% 18% 21% 23% 25% 28% 30% 32% 35% 37% 39% 42% 44% 46% 49% 51% 53% 56% 58% 60% 63% 65% 67% 70% 72% 74% 77% 79% 81% 84% 86% 89% 91% 93% 96% 98% 100% Butterfly.wmv (2732.16 KB) uploaded successfully.

Как видите, процент добавляется к предыдущим переданным значениям, тогда как я хочу перезаписать старое значение новым.

Есть ли встроенная функция для такого поведения в Django / python?Или я могу смоделировать это с помощью кода?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 01 марта 2011

Вы не можете перезаписать то, что уже отправили в браузер.Это удаленное сетевое соединение, помните: после того, как что-то было отправлено, оно было отправлено.

Вам понадобится сделать что-то умное с javascript или CSS, чтобы получить желаемый результат.

0 голосов
/ 01 марта 2011

Этот ответ выглядит довольно грязно.

Вообще говоря, большинство индикаторов времени при загрузке файлов реализованы с использованием JavaScript и модуля веб-сервера (я использовал его с Rails) или представления JSON (я использовал с django), который возвращает статус загрузки в JSON. Вот несколько модулей:

  • upload_progress_module для Apache
  • HttpUploadProgressModule для nginx
  • mod_uploadprogress для lighttpd

Обратите внимание, что эти модули имеют в виду Rails. Но они должны дать вам представление о том, как должен выглядеть интерфейс вашего представления json, которое возвращает прогресс. И приведите несколько примеров Java Script, чтобы вы могли получить общее представление о том, как все должно работать в части JS.

...