Django 项目是一个Python定制框架,它源自一个在线消息 Web 站点,于 2005 年以开源的情势被释放出来。本文将对django的要求流程举行源码剖析。
一、从浏览器发出一个要求,到返回响应内容,这个历程是怎样的?
1. 浏览器剖析输入的url
2. 查找url对应的ip地点
3. 经由过程ip地点接见我们的效劳器
a. 要求进入wsgi效劳器(我在这里省略了能够存在的代理效劳器,比方nginx)
b. wsgi效劳器将要求包装后,传递给django运用
c. django运用依据要求途径找到响应的处置惩罚函数举行处置惩罚
d. 处置惩罚完成后,django运用将响应返回给wsgi效劳器
e. wsgi效劳器将django运用返回的响应包装后,返回响应
4. 效劳器返回响应内容,浏览器衬着输出
二、django运用程序的处置惩罚进口
wsgi效劳经由过程wsgi协媾和django运用举行通讯,wsgi效劳是server端,django运用是application,server端经由过程django供应的application_callable函数去挪用djano运用,application_callable函数处置惩罚完成后,将响应返回给server
django的application_callable函数在django.core.handlers.wsgi.py文件中,server效劳端处置惩罚每一个要求时会挪用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
三、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找到要挪用的视图函数 resolver_match = resolver.resolve(request.path_info),然后挪用视图函数 response = wrapped_callback(request, *callback_args, **callback_kwargs)返回response(在_get_response内里也是会挪用一些的中间件的)
至此再将response返回给server,全部要求流程终了
四、总结
django关于一个要求,重要历程就是寻觅要求对应的视图函数,挪用被中间件封装后的视图函数,返回响应。
【引荐课程:Django视频教程】
以上就是django源码剖析之要求流程的细致内容,更多请关注ki4网别的相干文章!