문제

mod_wsgi에서는 start_response () 함수를 실행하여 헤더를 보냅니다. 그러나 모든 페이지 컨텐츠는 수율/반환으로 전달됩니다. start_response ()와 비슷한 방식으로 페이지 컨텐츠를 전달하는 방법이 있습니까? return.yield 문을 사용하는 것은 청크 데이터로 작업 할 때 매우 제한적입니다.

예를 들어

def Application():

    b = buffer()

    [... page code ...]

    while True:
        out = b.flush()    
        if out:
            yield out

class buffer:

    def __init__(self):        
        b = ['']
        l = 0

    def add(self, s):
        s = str(s)
        l += len(s)
        b.append(s)

    def flush(self):

        if self.l > 1000:
            out = ''.join(b)
            self.__init__()
            return out

버퍼가 페이지로드로 컨텐츠를 출력하는 것을 원하지만 컨텐츠가 충분히 쌓여 있으면 컨텐츠를 출력합니다 (예 : 1000 바이트).

도움이 되었습니까?

해결책

아니; 그러나 나는 그것이 제한적이라고 생각하지 않습니다. 어쩌면 당신은 당신의 제한을 설명하는 예제 코드를 붙여 넣고 우리가 도울 수 있습니다.

청크 데이터로 작업하려면 yield 청크 :

def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')]
    yield 'Chunk 1\n'    
    yield 'Chunk 2\n'    
    yield 'Chunk 3\n'
    for chunk in chunk_data_generator():
        yield chunk

def chunk_data_generator()
    yield 'Chunk 4\n'
    yield 'Chunk 5\n'

편집하다: 당신이 준 의견을 기반으로, 앞으로 보내기 전에 데이터를 일정 길이로 파기하는 예를 기반으로합니다.

BUFFER_SIZE = 10 # 10 bytes for testing. Use something bigger
def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')]
    buffer = []
    size = 0
    for chunk in chunk_generator():
        buffer.append(chunk)
        size += len(chunk)
        if size > BUFFER_SIZE:
            for buf in buffer:
                yield buf
            buffer = []
            size = 0

def chunk_data_generator()
    yield 'Chunk 1\n'    
    yield 'Chunk 2\n'    
    yield 'Chunk 3\n'
    yield 'Chunk 4\n'
    yield 'Chunk 5\n'

다른 팁

그것은이다 가능한 데이터를 "푸시"하는 응용 프로그램은 WSGI 서버에 다음과 같습니다.

일부 기존 애플리케이션 프레임 워크 API는 WSGI와 다른 방식으로 부패하지 않은 출력을 지원합니다. 구체적으로, 그들은 부패하지 않은 데이터 블록을 작성하기 위해 어떤 종류의 "쓰기"함수 또는 방법을 제공하거나, 그렇지 않으면 버퍼링 된 "쓰기"기능 및 "플러시"메커니즘을 제공하여 버퍼를 플러시합니다.

불행히도, 이러한 API는 스레드 또는 기타 특수 메커니즘을 사용하지 않는 한 WSGI의 "반복 가능한"응용 프로그램 리턴 값의 관점에서 구현할 수 없습니다.

따라서 이러한 프레임 워크가 명령 적 API를 계속 사용할 수 있도록 WSGI에는 특별한 write() 전화 가능 start_response 호출 가능.

새로운 WSGI 응용 프로그램 및 프레임 워크 해서는 안됩니다 사용 write() 그렇게하지 않을 수 있다면 전화 가능.

http://www.python.org/dev/peps/pep-0333/#the-write-callable

그러나 권장되지 않습니다.

일반적으로, 응용 프로그램은 (적당한 크기) 출력을 버리고 한 번에 모두 보내면서 최상의 처리량을 달성합니다. 이것은 Zope와 같은 기존 프레임 워크에서 일반적인 접근법입니다. 출력은 Stringio 또는 유사한 객체에 버퍼링 된 다음 응답 헤더와 함께 한 번에 전송됩니다.

WSGI의 해당 접근 방식은 응답 본문을 단일 문자열로 포함하는 단일 요소 반복 가능 (예 : 목록)을 간단히 반환하는 것입니다. 이것은 텍스트가 메모리에 쉽게 맞는 HTML 페이지를 렌더링하는 대부분의 응용 프로그램 기능에 대한 권장되는 접근법입니다.

http://www.python.org/dev/peps/pep-0333/#buffering-and-streaming

WSGI 애플리케이션 자체를 전송하기 전에 WSGI 응용 프로그램 자체를 부분적으로 버퍼로 변경하지 않으려면 WSGI 애플리케이션을 래핑하고 해당 작업을 수행하는 WSGI 미들웨어를 구현하십시오.

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