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
'UFO ET IT' 카테고리의 다른 글
"관리"코드 란 정확히 무엇입니까? (0) | 2021.01.15 |
---|---|
"overflow : auto"로 div의 스크롤 위치 (0) | 2021.01.15 |
포트란 : 정수 * 4 대 정수 (4) 대 정수 (종류 = 4) (0) | 2021.01.15 |
node.js에서 console.log와 sys.puts의 차이점은 무엇입니까? (0) | 2021.01.15 |
JPA 컬렉션에 어떤 Java 유형을 사용하고 그 이유는 무엇입니까? (0) | 2021.01.15 |