UFO ET IT

Django로 HttpResponse를 스트리밍하는 방법

ufoet 2021. 1. 15. 07:40
반응형

Django로 HttpResponse를 스트리밍하는 방법


Django (1.2)에서 작동하는 스트리밍 응답의 'hello world'를 얻으려고합니다. 나는 발전기와 yield함수 를 사용하는 방법을 알아 냈다 . 그러나 응답은 여전히 ​​스트리밍되지 않습니다. 나는 그것을 망쳐 놓는 미들웨어가 있다고 생각합니다-아마도 ETAG 계산기? 하지만 비활성화하는 방법을 잘 모르겠습니다. 누군가 도와 줄 수 있습니까?

지금까지 제가 가지고있는 스트리밍의 "hello world"는 다음과 같습니다.

def stream_response(request):
    resp = HttpResponse( stream_response_generator())
    return resp

def stream_response_generator():
    for x in range(1,11):
        yield "%s\n" % x  # Returns a chunk of the response to the browser
        time.sleep(1)

조건 데코레이터 를 사용하여 ETAG 미들웨어를 비활성화 할 수 있습니다 . 그러면 HTTP를 통해 스트림에 대한 응답을 받게됩니다. 같은 명령 줄 도구를 사용하여이를 확인할 수 있습니다 curl. 그러나 브라우저가 스트리밍 할 때 응답을 표시하는 것으로는 충분하지 않을 수 있습니다. 브라우저가 스트리밍 할 때 응답을 표시하도록 장려하려면 파이프 아래로 많은 공백을 밀어 버퍼를 강제로 채울 수 있습니다. 예는 다음과 같습니다.

from django.views.decorators.http import condition

@condition(etag_func=None)
def stream_response(request):
    resp = HttpResponse( stream_response_generator(), content_type='text/html')
    return resp

def stream_response_generator():
    yield "<html><body>\n"
    for x in range(1,11):
        yield "<div>%s</div>\n" % x
        yield " " * 1024  # Encourage browser to render incrementally
        time.sleep(1)
    yield "</body></html>\n"

많은 django 미들웨어가 콘텐츠 스트리밍을 방해합니다. 장고 관리자 앱을 사용하려면이 미들웨어의 대부분을 활성화해야하므로 성 가실 수 있습니다. 다행히이 문제는 django 1.5 릴리스 에서 해결 되었습니다 . StreamingHttpResponse사용하여 결과를 다시 스트리밍하고 싶다는 것을 나타낼 수 있으며 django와 함께 제공되는 모든 미들웨어는이를 인식하고 그에 따라 콘텐츠 출력을 버퍼링하지 않고 바로 아래로 전송합니다. 그러면 새 StreamingHttpResponse 개체를 사용하는 코드가 다음과 같이 표시됩니다.

def stream_response(request):
    return StreamingHttpResponse(stream_response_generator())

def stream_response_generator():
    for x in range(1,11):
        yield "%s\n" % x  # Returns a chunk of the response to the browser
        time.sleep(1)

Apache에 대한 참고 사항

Ubuntu 13.04를 사용하여 Apache 2.2에서 위의 내용을 테스트했습니다. 내가 테스트 한 설정에서 기본적으로 활성화 된 아파치 모듈 mod_deflate는 특정 블록 크기에 도달 할 때까지 스트리밍하려는 콘텐츠를 버퍼링 한 다음 콘텐츠를 gzip하여 브라우저로 보냅니다. 이렇게하면 위의 예가 원하는대로 작동하지 않습니다. 이것을 피하는 한 가지 방법은 아파치 구성에 다음 줄을 넣어 mod_deflate를 비활성화하는 것입니다.

SetEnvIf Request_URI ^/mysite no-gzip=1

이것은 apache2에서 mod_deflate를 비활성화 하는 방법 에서 자세히 설명합니다 . 질문.

참조 URL : https://stackoverflow.com/questions/2922874/how-to-stream-an-httpresponse-with-django

반응형