2014-07-10 4 views
1

비 WSGI 방법 :WSGI가 start_response를 사용해야하고 반복기를 반환해야하는 이유는 무엇입니까?

def my_view(request): 
    request.start_response('200 OK') 
    request.send_header('Content-Type', 'text/plain') 
    request.end_headers() 
    request.write('Hello World!') 
    request.write('Goodbye World!') 
    request.end() 

WSGI 방법 :

def my_view(environ, start_response): 
    def generate(): 
     yield 'Hello World!' 
     yield 'Goodbye World!' 
    start_response('200 OK', [('Content-Type', 'text/plain')]) 
    return generate() 

나는 확실히 그것을 이해하지 못했다 불구하고 코드, this blog에서 있습니다 ..

에서 볼 수있는 바와 같이 위에서 WSGI가 아닌 것이 훨씬 쉽게 보입니다. 그리고 WSGI는 혼란스럽게 보입니다. start_reponsemy_view에 전달되어야하는 이유는 무엇입니까? my_view이 반복자를 반환해야하는 이유는 무엇입니까? 그리고 WSGI 방식으로 request 객체는 어디에 있습니까?

누구에게이 아이디어가 있습니까?

+0

[PEP 333] (http://legacy.python.org/dev/peps/pep-0333/)에는 답변이 있어야합니다. – jwalker

답변

3

간단한 대답은 다음과 같습니다. WSGI에서이 방법을 지정하기 때문에 이렇게해야합니다. ;-)

start_response()은 두 예제 모두에 전달됩니다. 첫 번째 예제에서는 request 개체와 "번들로 묶여"WSGI는 응답을 시작하기 위해 호출 변수에서 환경 변수를 분리합니다.

반복 가능을 반환하면 느린 방식으로 응답을 생성하고 하나의 미들웨어에서 다음 미디웨어로 전체 내용을 한 번에 넘겨 줄 필요없이 여러 미들웨어를 쉽게 연결할 수 있습니다. 반환 값은 반복자가 아니라 반복자가 아니어야하므로 생성기 함수는 가장 간단한 방법은 아닙니다.

def app(environ, start_response): 
    start_response('200 OK', [('Content-type', 'text/plain')]) 
    return ['Hello world!\n'] 

나는이 비 WSGI의 예를 실제로 더 간단하고 쉽게 보이는 생각 : 그래서 이것은 WSGI 응용 프로그램의 가장 작은 예가 될 것입니다.