>  기사  >  백엔드 개발  >  Django 소스코드 분석 요청 프로세스

Django 소스코드 분석 요청 프로세스

little bottle
little bottle앞으로
2019-04-08 17:48:182064검색

Django 프로젝트는 온라인 뉴스 웹사이트에서 시작되어 2005년에 오픈 소스로 출시된 Python 사용자 정의 프레임워크입니다. 이 기사에서는 django의 요청 프로세스에 대한 소스 코드 분석을 수행합니다.

1. 브라우저에서 요청을 보내고 응답 콘텐츠를 반환하는 과정은 무엇인가요?

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
3. Django 요청 처리 과정

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

다음으로 요청은 WSGIHandler

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 동영상 튜토리얼

위 내용은 Django 소스코드 분석 요청 프로세스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제