mod_wsgi 수익률은 리턴 대신 출력 버퍼를 산출합니다
문제
지금 당장 나는 이와 같이 구성된 mod_wsgi 스크립트를 가지고 있습니다 ..
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
나는 누군가가 이것을 변화시키는 방법을 알고 있는지 궁금했다. yield
대신 기초 return
, 이렇게하면 페이지가 생성 될 때 페이지를 보낼 수 있고 완료된 일단 완료된 경우뿐만 아니라 페이지로드가 사용자에게 더 빠르게 진행될 수 있습니다.
그러나 목록의 출력을 바꾸고 Application ()에서 수율을 올릴 때마다 오류가 발생합니다.
TypeError: sequence of string values expected, value of type list found
해결책
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
yield output
"그러나 목록의 출력을 바꾸고 application ()에서 수율을 바꿀 때마다 오류가 발생합니다."
글쎄, 목록을 양보하지 마십시오. 대신 각 요소를 산출하십시오.
for part in mylist:
yield part
또는 목록이 전체 컨텐츠 인 경우 :
return mylist
목록은 이미 반복자이며 그 자체로 생성 할 수 있기 때문입니다.
다른 팁
절대적으로 필요한 경우가 아니라면 '수율'을 피해야합니다. 특히 작은 문자열을 산출하는 경우 특히 '수율'은 비효율적입니다. 이는 WSGI 사양에 따라 각 문자열이 산출 한 후 응답을 플러시해야합니다. Apache/mod_wsgi의 경우 플러싱은 각 문자열이 Apache 출력 버킷 여단과 필터 시스템을 통해 소켓으로 강제되는 것을 의미합니다. Apache 출력 필터 시스템의 오버 헤드를 무시하면 소켓에 작은 문자열을 많이 쓰는 것은 처음부터 나쁘다.
이 문제는 또한 어레이의 각 문자열 사이에서 플러시가 수행되어야하므로 적용으로 문자열 배열이 응용 프로그램에서 반환되는 경우에도 존재합니다. 문자열이 목록이 아닌 반복적 인 것으로 처리되기 때문입니다. 따라서 사전 형식의 문자열 목록의 경우 개별 문자열을 하나의 큰 문자열로 결합하고 해당 문자열이 포함 된 목록을 반환하는 것이 훨씬 좋습니다. 이를 수행하면 WSGI 구현이 명시 적으로 제공되지 않은 경우 응답에 대한 컨텐츠 길이를 자동으로 생성 할 수 있습니다.
목록의 모든 문자열을 하나로 결합 할 때 결과가 목록에 반환되는지 확인하십시오. 이 작업이 완료되지 않고 문자열이 반환되면, 그 문자열은 반복 가능한 것으로 취급되며, 여기서 문자열의 각 요소는 단일 문자열입니다. 이로 인해 모든 캐릭터 후에 플러시가 완료됩니다. 이는 문자열이 결합되지 않은 경우보다 훨씬 나빠질 것입니다.
내용 길이를 보내지 말고 유도 할 때 출력을 보내십시오. 단순히 콘텐츠 길이 헤더를 보내지 않으면 출력 크기를 알 필요가 없습니다. 그런 식으로 나머지 부분을 계산하기 전에 응답의 일부를 보낼 수 있습니다.
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
response_headers = [('Content-type', 'text/html')]
start_response(status, response_headers)
yield head()
yield part1()
yield part2()
yield part3()
yield "<!-- bye now! -->"
그렇지 않으면 출력을 계산하는 것은 느린 부분 일 수 있고 인터넷 프로토콜은 어쨌든 출력을 청크로 보낼 수 있기 때문에 청크를 보내는 데 도움이되지 않습니다.
슬프게도, 이것은 Part2 ()의 계산이 실제로 쿠키와 같은 헤더를 변경해야한다고 결정하거나 다른 페이지 글로벌 데이터 구조를 구축해야한다고 결정한 경우에는 작동하지 않습니다. 헤더를 보내기 전에 전체 출력을 계산해야하며 return [output]
예를 들어 http://aaron.oirt.rutgers.edu/myapp/docs/w1200_1200.config_template페이지 상단에 표시되는 하위 섹션 링크에 대한 페이지 글로벌 데이터 구조를 구축해야하므로 첫 번째 출력 청크가 클라이언트에게 전달되기 전에 마지막 하위 섹션을 렌더링해야합니다.