ホームページ  >  記事  >  バックエンド開発  >  Django ソースコード分析リクエストのプロセス

Django ソースコード分析リクエストのプロセス

little bottle
little bottle転載
2019-04-08 17:48:182081ブラウズ

Django プロジェクトは、オンライン ニュース Web サイトから生まれ、2005 年にオープン ソースとしてリリースされた Python カスタム フレームワークです。この記事では、django のリクエスト処理のソースコード解析を行います。

1. ブラウザがリクエストを発行してからレスポンスの内容を返すまでのプロセスは何ですか?

1. ブラウザは入力 URL

2. URL に対応する IP アドレスを検索します

#3. IP アドレスを通じてサーバーにアクセスします

a . リクエストは wsgi サーバーに入ります (nginx などのプロキシ サーバーの可能性はここでは省略しています)

b. wsgi サーバーはリクエストをパッケージ化し、django アプリケーションに渡します

c. django アプリケーションは、リクエスト パスが処理に対応する処理関数を見つけます

# d. 処理が完了すると、django アプリケーションは wsgi サーバーに応答を返します

# e. d. 処理が完了すると、django アプリケーションは wsgi サーバーに応答を返します。 wsgi サーバーは、django アプリケーションから返された応答をパッケージ化し、応答

4 を返します。サーバーは応答の内容を返し、ブラウザは出力をレンダリングします

2. django アプリケーションの処理の入り口

wsgi サービスは、wsgi プロトコルを介して django アプリケーションと通信します。 wsgi サービスはサーバー側であり、Django アプリケーションはアプリケーションです。サーバー側は、Django が提供する application_callable 関数を通じて Djano アプリケーションを呼び出します。 application_callable 関数が処理された後、応答がサーバーに返されます

#django application_callable 関数は django.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

_get_response 関数を呼び出します。まず、呼び出されるビュー関数が URL

solver_match =solver.resolve( request.path_info)

、そしてビュー関数

response =ipped_callback(request, *callback_args, **callback_kwargs) レスポンスを返します (一部のミドルウェアは _get_response でも呼び出されます)この時点で、応答がサーバーに返され、リクエストのプロセス全体が完了します

4. 概要

django リクエストの主なプロセスは、対応するビュー関数を見つけることです。リクエストに対して、ミドルウェアによってカプセル化された view 関数を呼び出し、レスポンスを返します。

[推奨コース:

Django ビデオ チュートリアル

]

以上がDjango ソースコード分析リクエストのプロセスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。