복붙노트

[PYTHON] HttpResponse를 장고로 스트리밍하는 법

PYTHON

HttpResponse를 장고로 스트리밍하는 법

장고 (1.2)에서 작동하는 스트리밍 응답의 '안녕하세요 세상'을 얻으려고합니다. 나는 발전기와 항복 기능을 사용하는 방법을 알아 냈다. 그러나 응답은 여전히 ​​스트리밍되지 않습니다. ETAG 계산기 일 가능성이있는 미들웨어가 의심 스럽습니다. 그러나 나는 그것을 어떻게 무력화 시킬지 잘 모르겠습니다. 누군가 제발 도와 줄 수 있니?

지금까지 내가 가지고있는 스트리밍의 "안녕하세요 세상"이 있습니다.

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)

해결법

  1. ==============================

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

    조건 데코레이터를 사용하여 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"
    
  2. ==============================

    2.장고 미들웨어를 많이 사용하면 스트리밍 콘텐츠를 막을 수 있습니다. django admin 앱을 사용하려면이 미들웨어의 상당 부분을 활성화해야합니다. 그래서 이것은 귀찮은 일일 수 있습니다. 다행히도 이것은 django 1.5 릴리스에서 해결되었습니다. StreamingHttpResponse를 사용하여 결과를 스트리밍하고 django와 함께 제공되는 모든 미들웨어가이를 인식하고 컨텐트 출력을 버퍼링하지 않고 직선으로 전송하도록 지시 할 수 있습니다. 그런 다음 새 StreamingHttpResponse 객체를 사용하기 위해 코드가 다음과 같이 표시됩니다.

    장고 미들웨어를 많이 사용하면 스트리밍 콘텐츠를 막을 수 있습니다. django admin 앱을 사용하려면이 미들웨어의 상당 부분을 활성화해야합니다. 그래서 이것은 귀찮은 일일 수 있습니다. 다행히도 이것은 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)
    

    아파치에 대한주의 사항

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

    SetEnvIf Request_URI ^/mysite no-gzip=1
    

    이 문제는 apache2에서 mod_deflate를 비활성화하는 방법에 자세히 설명되어 있습니다. 문제.

  3. from https://stackoverflow.com/questions/2922874/how-to-stream-an-httpresponse-with-django by cc-by-sa and MIT license