Потоковые HTTP-ответы Zope с прокси - PullRequest
3 голосов
/ 05 августа 2011

Я использую следующий код PLone + urllib для прокси-ответов от другого сервера через BrowserView

req = urllib2.Request (full_url)

    try:

        # Important or if the remote server is slow
        # all our web server threads get stuck here
        # But this is UGLY as Python does not provide per-thread
        # or per-socket timeouts thru urllib
        orignal_timeout = socket.getdefaulttimeout()
        try:
            socket.setdefaulttimeout(10)

            response = urllib2.urlopen(req)
        finally:
            # restore orignal timeoout
            socket.setdefaulttimeout(orignal_timeout)

        # XXX: How to stream respone through Zope
        # AFAIK - we cannot do it currently

        return response.read()

Мой вопрос, как я могузаставить эту функцию не блокировать и не начинать потоковую передачу ответа через Zope мгновенно, когда поступят первые байты?Когда интерфейсы, объекты или шаблоны используются при создании потоковых ответов Zope?

Ответы [ 2 ]

5 голосов
/ 06 августа 2011

Я думаю, что есть два способа сделать это. Во-первых, сам ответ Zope подобен файлу, поэтому вы можете использовать метод ответа write() для записи последовательных фрагментов данных в ответ по мере их поступления. Вот пример где Я использую ответ Zope как файлоподобный объект для csv.writer.

Или вы можете использовать IStreamIterators ZPublisher и обернуть ответ в ZPublisher.Iterators.filestream_iterator оболочку и вернуть оболочку.

0 голосов
/ 28 августа 2014

На самом деле это должен быть комментарий, но у меня пока нет репутации. Я пытаюсь сделать то же самое, что и вы, Микко, и RESPONSE.write () делает именно это, как сказал Росс. Однако обратите внимание, что байты на самом деле не покидают интерфейс, пока их не будет 64 КБ (или соединение не будет закрыто). Очистка стандартного вывода не поможет, так что, похоже, вам придется еще больше вмешиваться в работу сокета, чтобы сразу же отправить несколько байтов.

...