wgiref 소스 코드 분석 -- startresponse()
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!
"
그 속
그 통속 적 인 말:
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
。 start_response(status, response_headers, exc_info=None)
status 매개 변 수 는 상태 코드 입 니 다. 예 를 들 어 200 OK
。 response_headers 인 자 는 목록 입 니 다. 목록 항목 의 형식 은 (header name, header value) 입 니 다.
exc_info 매개 변 수 는 오류 처리 시 사용 합 니 다.
status 와 responseheaders 의 구체 적 인 내용 은 참고 할 수 있 습 니 다. HTTP 프로 토 콜 Response 부분 입 니 다.
write(body_data)
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 를 통 해 이 루어 질 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.