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 response3. 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
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 サイトの他の関連記事を参照してください。