문제

지금 당장 나는 이와 같이 구성된 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페이지 상단에 표시되는 하위 섹션 링크에 대한 페이지 글로벌 데이터 구조를 구축해야하므로 첫 번째 출력 청크가 클라이언트에게 전달되기 전에 마지막 하위 섹션을 렌더링해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top