wgiref 소스 코드 분석 -- startresponse()

http://blog.csdn.net/on_1y/article/details/18818081
http://blog.csdn.net/on_1y/article/details/18803563
서버 측 과 응용 프로그램
        ① 서버 측: 응용 프로그램 을 호출 하여 응용 프로그램 에 (환경 정보) 와 (리 셋 함수) 를 제공 합 니 다. 이 리 셋 함 수 는 응용 프로그램 이 설정 한 http header 와 status 등 정 보 를 서버 측 에 전달 하 는 데 사 용 됩 니 다.
② 응용 프로그램: 서버 측 에 되 돌아 갈 수 있 도록 돌아 오 는 header, body, status 를 생 성 합 니 다.
     Python 언어 로 WSGI 에 맞 는 "Hello World" 프로그램 은 다음 과 같 습 니 다.
def app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    yield "Hello world!
"

그 속
  • 첫 번 째 줄 은 app 이라는 프로그램 을 정의 하고 두 개의 인 자 를 받 습 니 다. environ 과 startresponse, environ 은 CGI 의 환경 변 수 를 포함 하 는 사전 입 니 다. startresponse 도 하나의 callable 입 니 다. 두 개의 필수 인자, status (HTTP 상태) 와 response 를 받 아들 입 니 다.headers.
  • 두 번 째 줄 에서 start 호출response, 상 태 는 '200 OK' 로 지정 되 고 메시지 헤드 는 콘 텐 츠 유형 으로 지정 되 며 'text / plain'
  • 입 니 다.
  • 세 번 째 줄 은 메시지 에 응답 하 는 메시지 체 를 되 돌려 줍 니 다.

  •    그 통속 적 인 말:
    wgi 의 서버 측: 우 리 는 웹 서버 라 고 이해 할 수 있 습 니 다. 물론 이 웹 서버 는 외부 에 설 치 된 것 일 수도 있 습 니 다. 예 를 들 어 lighttpd, python 이 직접 쓴 것 일 수도 있 습 니 다.
    응용 프로그램 은 '요청 의 통일 입구!모든 요청 은 이 app 에 들 어가 서 처리 합 니 다!이 앱 은 솔직히 함수 다!!(클래스 의 call 는 같은 이치 입 니 다)
    =========================================================================================================
    WSGI 응용
    WSGI 응용 프로그램 은 사실 callable 의 대상 이다.가장 간단 한 예 를 들 어 다음 과 같은 응용 이 존재 한다 고 가정 합 니 다.
    ?
    1
    2
    3
    4
    5
    6
    7
    8 def application(environ, start_response):     status = '200 OK'      output = 'World!'      response_headers = [( 'Content-type' , 'text/plain' ),                         ( 'Content-Length' , str ( 12 )]     write = start_response(status, response_headers)     write( 'Hello '    return [output]
    이 WSGI 응용 프로그램 은 간단 하고 초라 하 다 고 형용 할 수 있 지만 그 는 확실히 기능 이 완전한 WSGI 응용 프로그램 이다.단지 사람들 에 게 너무 많은 의문점 을 남 겼 을 뿐 인 데, environ 은 무엇 입 니까?start_response 가 뭐 예요?왜 write 와 return 으로 내용 을 동시에 되 돌 릴 수 있 습 니까?
    이런 의문 들 에 대해 서 는 스스로 그의 역할 을 추측 해 보 는 것 도 괜찮다.CGI 를 연상 하면 environ 은 HTTP 요청 정 보 를 나타 내 는 일련의 환경 변수 일 수 있 습 니 다. 예 를 들 어 method 와 같은 것 입 니 다.start_response, HTTP response 헤더 정 보 를 받 은 다음 write 함 수 를 되 돌려 줄 수 있 습 니 다. 이 write 함 수 는 HTTP response 의 body 를 클 라 이언 트 에 게 되 돌려 줄 수 있 습 니 다.return 은 당연히 HTTP response 의 body 정 보 를 되 돌려 줍 니 다.그런데 여기 있 는 write 와 함수 반환 은 어떤 차이 가 있 습 니까?실제 외곽 기본 호출 write 가 응용 반환 값 을 처리 하 는 것 이 아 닙 니까?그리고 왜 적용 되 는 반환 값 이 목록 입 니까?응용 실행 결과 에 대한 교체 출력 과정 이 분명히 존재 한 다 는 것 을 설명 한다.혹시 그 가 은근히 iterator 나 generator 를 지지 한 다 는 건 가요?
    잠깐 만, 응용 실행 결과?하나의 응용 이 함수 인 이상 한 대상 이 그것 을 실행 하고 이 대상 이 environ 과 start 를response 를 응용 프로그램 에 전송 하고 응용 결 과 를 클 라 이언 트 에 출력 합 니 다.그럼 이 상 대 는 무엇 일 까요?당연히 WSGI 용기 지.
    여기 에는 해결 되 지 않 은 문제 가 많은 것 같다.
    1: wsgi 한쪽 의 웹 서버 가 무엇 인지, 이것 은 매우 지혜 롭 지 못 한 문제 인 것 같다.예 를 들 어 lighttd 는 웹 서버 입 니 다. lighttpd 설정 파일 에서 프로그램의 입구 스 크 립 트 (예 를 들 어 index. php) 를 지정 할 수 있 습 니 다. 모든 요청 은 이 index. php 로 전 환 됩 니 다. 그럼 gunicorn 은 요?모두 python 으로 썼 지만 원 리 는 lighttpd 와 같 습 니 다. 내 부 는 socket 을 열 어 요청 을 감청 한 다음 백 엔 드 python 스 크 립 트 로 요청 을 실행 합 니 다!당연 하지: 그것 은 하나의 함수 로 옮 겨 서 실행 하 는 것 일 뿐 이 야!그래서 우리 가 해 야 할 일 은 바로 이 함 수 를 실현 한 후에 이 함 수 를 gunicorn 에 불 러 온 다음 에 gunicorn 을 시작 하면 됩 니 다!!!
     
    WSGI 상세 설명
    주의: 점 으로 시작 하 는 해석 은 WSGI 규정 입 니 다. 반드시 만족해 야 한다 라 고 적 었 다.
    응용 프로그램
  • 응용 프로그램 은 호출 가능 대상
  • 호출 가능 한 대상 은 두 개의 위치 매개 변수 가 있 습 니 다. 이른바 위치 매개 변 수 는 호출 할 때 위치 에 따라 매개 변수의 의 미 를 확인 하 는 것 입 니 다. 즉, 서버 가 응용 프로그램 을 호출 할 때 이렇게 해 야 합 니 다.
  •  
    application(env, start_response)
    

    그게 아니 라
     
    application(start_response=start_response, environ=env)
    

    그래서 매개 변수 이름 은 마음대로 지 을 수 있 습 니 다. 의 미 를 명확 하 게 하기 위해 서 우 리 는 지 었 습 니 다 environ 화해시키다  start_response
  • 첫 번 째 매개 변수 environ 은 Python 에 내 장 된 dict 대상 으로 응용 프로그램 은 이 매개 변 수 를 임의로 수정 할 수 있 습 니 다.
  • environ 매개 변 수 는 WSGI 에 필요 한 일부 변 수 를 포함해 야 합 니 다. (상세 한 것 은 뒷글 참조) 확장 매개 변 수 를 포함 할 수 있 습 니 다. 명명 규범 은 뒷글 참조
  • start_response 매개 변 수 는 호출 가능 한 대상 입 니 다.두 개의 위치 매개 변 수 를 받 아들 이 고 선택 가능 한 매개 변 수 를 받 습 니 다.예 를 들 어 start_response(status, response_headers, exc_info=None)  status 매개 변 수 는 상태 코드 입 니 다. 예 를 들 어  200 OK  。

  • response_headers 인 자 는 목록 입 니 다. 목록 항목 의 형식 은 (header name, header value) 입 니 다.
    exc_info 매개 변 수 는 오류 처리 시 사용 합 니 다.
    status 와 responseheaders 의 구체 적 인 내용 은 참고 할 수 있 습 니 다. HTTP 프로 토 콜 Response 부분 입 니 다.
  • start_response 는 호출 가능 한 대상 을 되 돌려 야 합 니 다:  write(body_data)
  • 응용 프로그램 은 교체 가능 한 대상 을 되 돌려 야 합 니 다.
  • 응용 프로그램 은 돌아 갈 수 있 는 교체 가능 한 대상 이 종 료 될 때 까지 옮 겨 다 니 는 것 을 가정 해 서 는 안 됩 니 다. 옮 겨 다 니 는 과정 에 오류 가 발생 할 수 있 기 때 문 입 니 다.
  • 응용 프로그램 은 교체 가능 한 데 이 터 를 처음 되 돌려 주기 전에 start 를 호출 해 야 합 니 다.response 방법.이것 은 교체 가능 한 데이터 가 데 이 터 를 되 돌려 주기 때문이다.  body  부분, 되 돌아 오기 전에 사용 해 야 합 니 다.  start_response  되돌아오다  response_headers 데이터.

  • start_response()
    start_response 는 HTTP 응답 의 시작 입 니 다. 그 형식 은 다음 과 같 습 니 다.
     
    start_response(status, response_headers, exc_info=None)
    

    호출 가능 한 대상 을 되 돌려 줍 니 다. 이 호출 가능 한 대상 형식 은:
     
    write(body_data)
    

    status 는 HTTP 상태 코드 를 표시 합 니 다. 예 를 들 어 "200 OK", "404 Not Found" 등 입 니 다. RFC 2616 에 서 는 status 가 제어 문 자 를 포함 하지 못 하도록 정의 합 니 다.
    response_headers 는 목록 입 니 다. 목록 항목 은 이원 그룹 입 니 다. (header name, heaer value) 각 headername RFC 2616 4.2 절 에서 정 의 된 HTTP 헤더 이름 입 니 다.header_value  제어 문자 포함 금지.
    또한 서버 프로그램 은 정확 한 headers 가 클 라 이언 트 에 되 돌아 갈 수 있 도록 해 야 합 니 다. 프로그램 이 headers 로 돌아 가지 않 으 면 서버 가 추가 해 야 합 니 다.
    응용 프로그램 과 middleware 는 HTTP / 1.1 의 'hop - by - hop' 기능 을 사용 하지 못 하고 클 라 이언 트 와 서버 의 영구적 인 연결 에 영향 을 줄 수 있 는 다른 기능 을 사용 하지 못 합 니 다.
    start_response 가 호출 되 었 을 때 서버 는 headers 의 오 류 를 검사 해 야 합 니 다. 또한 start 를 금지 합 니 다.response 직접 responseheaders 는 클 라 이언 트 에 게 전달 합 니 다. 프로그램 이 처음으로 비 어 있 는 데 이 터 를 되 돌려 줄 때 까지 저장 해 야 responseheaders 는 클 라 이언 트 에 게 전 달 됩 니 다.HTTP 응답 body 부분 에 데이터 가 있어 야 하 며 헤더 만 되 돌려 서 는 안 된다 는 것 이다.
    start_response 의 세 번 째 매개 변 수 는 선택 가능 한 매개 변수 입 니 다. excinfo, Python 의 sys. excinfo () 가 되 돌려 주 는 데 이 터 는 같은 형식 입 니 다.요청 을 처리 하 는 과정 에서 오류 가 발생 하면 이 매개 변 수 는 설정 되 고 start 를 호출 합 니 다.response。하면, 만약, 만약...info, 하지만 HTTP headers 가 출력 되 지 않 았 습 니 다. 그러면 startresponse 는 현재 저 장 된 HTTP response headers 를 새 값 으로 바 꿔 야 합 니 다.하지만 exc 를 제공 하면info, 동시에 HTTP headers 가 출력 되 었 습 니 다. 그러면 startresponse  raise 에 error 가 있어 야 합 니 다.응용 프로그램 처리 금지 startresponse raise 에서 나 온 exceptions 는 서버 프로그램 에 맡 겨 야 합 니 다.
    또한 exc 를 제공 할 때 만info 매개 변수 시 startresponse 는 한 번 이상 호출 될 수 있 습 니 다.이 인 자 를 제공 하지 않 았 다 면 startresponse 는 현재 프로그램 에서 호출 된 후 재 호출 을 금지 합 니 다.
    순환 인용 을 피하 기 위해 startresponse 실현 시 exc 보증 필요info 는 함수 호출 후 인용 을 포함 하지 않 습 니 다.그 러 니까 startresponse 소 진 excinfo 후 한 마디 실행 을 보증 해 야 합 니 다.
     
    exc_info = None
    

    이것 은 try / finally 를 통 해 이 루어 질 수 있다.
     

    좋은 웹페이지 즐겨찾기