1. 브라우저는 입력된 URL
2. URL에 해당하는 IP 주소를 찾습니다
3. 해당 IP 주소를 통해 서버에 접속합니다
a. nginx와 같은 서버)
b. wsgi 서버는 요청을 패키징하여 django 애플리케이션에 전달합니다.
c. django 애플리케이션은 처리를 위한 요청 경로에 따라 해당 처리 기능을 찾습니다. d. 완료되면 django 애플리케이션은 wsgi 서버에 응답을 반환합니다.
e. wsgi 서버는 django 애플리케이션에서 반환된 응답을 패키지하고 응답을 반환합니다.
4. 서버는 응답 콘텐츠를 반환하고 브라우저는 출력을 렌더링합니다. 2. django 애플리케이션의 처리 입구
wsgi 서비스는 wsgi 프로토콜을 통해 django와 통신합니다. 애플리케이션이 통신하는데, wsgi 서비스는 서버측이고, django 애플리케이션은 애플리케이션입니다. django에서 제공하는 함수 application_callable 함수가 처리된 후 서버
django의 application_callable 함수로 응답이 반환됩니다. .core.handlers.wsgi.py 파일에서 서버는 처리 시 WSGIHandler 클래스를 호출합니다. 각 요청#wsgi.py文件 class WSGIHandler(base.BaseHandler): request_class = WSGIRequest def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.load_middleware() def __call__(self, environ, start_response): set_script_prefix(get_script_name(environ)) signals.request_started.send(sender=self.__class__, environ=environ) request = self.request_class(environ) response = self.get_response(request) response._handler_class = self.__class__ status = '%d %s' % (response.status_code, response.reason_phrase) response_headers = list(response.items()) for c in response.cookies.values(): response_headers.append(('Set-Cookie', c.output(header=''))) start_response(status, response_headers) if getattr(response, 'file_to_stream', None) is not None and environ.get('wsgi.file_wrapper'): response = environ['wsgi.file_wrapper'](response.file_to_stream) return response
WSGIHandler 클래스가 초기화되면 미들웨어가 먼저 로드되고 요청하려는 함수인 _get_response 가 미들웨어로 캡슐화됩니다(미들웨어는 데코레이터와 동일). 미들웨어가 실행됩니다
# wsgi.py文件
# wsgi.py文件 def load_middleware(self): ... self._view_middleware = [] self._template_response_middleware = [] self._exception_middleware = [] handler = convert_exception_to_response(self._get_response) for middleware_path in reversed(settings.MIDDLEWARE): middleware = import_string(middleware_path) try: mw_instance = middleware(handler) except MiddlewareNotUsed as exc: ... handler = convert_exception_to_response(mw_instance) self._middleware_chain = handler
1를 호출하는 것입니다. request_class를 인스턴스화합니다
2. get_response 요청을 통해 get_response는 결국 미들웨어에 의해 캡슐화된 _get_response 함수를 호출합니다
def _get_response(self, request): response = None if hasattr(request, 'urlconf'): urlconf = request.urlconf set_urlconf(urlconf) resolver = get_resolver(urlconf) else: resolver = get_resolver() resolver_match = resolver.resolve(request.path_info) callback, callback_args, callback_kwargs = resolver_match request.resolver_match = resolver_match ... if response is None: wrapped_callback = self.make_view_atomic(callback) try: response = wrapped_callback(request, *callback_args, **callback_kwargs) except Exception as e: response = self.process_exception_by_middleware(e, request) ... return response
, 먼저 URL을 기반으로 호출할 뷰 함수를 찾습니다
resolver_match = resolver.resolve(request.path_info), 그런 다음 뷰 함수를 호출합니다
response = Wrapped_callback(request, *callback_args, **callback_kwargs)Return (일부 미들웨어는 _get_response에서도 호출됩니다.)이 시점에서 응답이 서버로 반환되고 전체 요청 프로세스가 완료됩니다.IV. 요약
Django의 주요 요청 프로세스는 요청에 해당하는 view 함수를 호출하고, 미들웨어로 캡슐화된 view 함수를 호출하고 응답을 반환합니다.
】
위 내용은 Django 소스코드 분석 요청 프로세스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!