Django - отправлять вывод постоянно - PullRequest
4 голосов
/ 26 октября 2009

Я хочу начать обработку некоторых файлов из представления django, и я хочу иметь возможность отправлять имена файлов в браузер по мере их обработки. Есть ли способ сделать это (легко)? Я мог бы сделать это, используя потоки и вызовы ajax, но сейчас мне нужно самое простое решение.

Ответы [ 5 ]

6 голосов
/ 26 октября 2009

Я нашел то, что мне нужно, в ответе по одной из ссылок, которые Андре Миллер предоставил.

Я обнаружил, что возможно передать итератор в HttpResponse, поэтому я использовал этот код, и он работал:

def import_iter():
    """ Used to return output as it is generated """
    # First return the template
    t = loader.get_template('main/qimport.htm')
    c = Context()
    yield t.render(c)
    # Now process the files
    if req.method == 'POST':
        location = req.POST['location']
        if location:
            for finfo in import_location(location):
                yield finfo+"<br/>"

return HttpResponse(import_iter())
2 голосов
/ 26 октября 2009

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

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

Здесь есть сервер очередей Django, который вы можете использовать:

http://code.google.com/p/django-queue-service/

Казалось бы, этот вопрос также задавался несколько раз раньше:

0 голосов
/ 12 августа 2017

Мы находимся в 201X

Да, вы должны использовать вызовы WebSockets или Ajax !!

Поскольку вы запрашивали (для целей записи) какое-то потоковое решение в Django, вы можете использовать StreamingHttpResponse, который Django поддерживает из коробки.

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.StreamingHttpResponse

Класс StreamingHttpResponse используется для потоковой передачи ответа от Django в браузер. Возможно, вы захотите сделать это, если генерация ответа занимает слишком много времени или использует слишком много памяти. Например, это полезно для создания больших файлов CSV.

0 голосов
/ 26 октября 2009

Прежде всего, убедитесь, что вы выводите заголовок Connection: Keep-Alive, после чего вам просто нужно убедиться, что вывод сценария не буферизуется. В Python вы можете использовать функцию cgiprint модуля cgi, чтобы гарантировать очистку буфера Python, но вы также должны проверить конфигурацию веб-сервера, так как некоторые из них будут буферизовать весь вывод до завершения работы скрипта.

0 голосов
/ 26 октября 2009

Если вы очистите выходной буфер , то сможете увидеть, что было обработано.

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