运行启动,定位到http的处理文件
在core/handler.py中
def load_middleware(self): 。。。。。。 request_middleware = [] for middleware_path in settings.MIDDLEWARE_CLASSES: 。。。。。。加载模块 if hasattr(mw_instance, 'process_request'): request_middleware.append(mw_instance.process_request) if hasattr(mw_instance, 'process_view'): self._view_middleware.append(mw_instance.process_view) if hasattr(mw_instance, 'process_template_response'): self._template_response_middleware.insert(0, mw_instance.process_template_response) if hasattr(mw_instance, 'process_response'): self._response_middleware.insert(0, mw_instance.process_response) if hasattr(mw_instance, 'process_exception'): self._exception_middleware.insert(0, mw_instance.process_exception) self._request_middleware = request_middleware
支持process_request的,插入request中间件
支持process_view的,插入view
支持process_template_response的插入template
支持process_response的插入response
支持process_exception的插入exception
在http处理中
def get_response(self, request): try: urlconf = settings.ROOT_URLCONF urlresolvers.set_urlconf(urlconf) resolver = urlresolvers.RegexURLResolver(r'^/', urlconf) try: response = None # Apply request middleware for middleware_method in self._request_middleware: response = middleware_method(request) if response: break if response is None: 。。。 # Apply view middleware for middleware_method in self._view_middleware: response = middleware_method(request, callback, callback_args, callback_kwargs) if response: break if response is None: try: response = callback(request, *callback_args, **callback_kwargs) except Exception as e: for middleware_method in self._exception_middleware: response = middleware_method(request, e) if response: break if response is None: raise # Complain if the view returned None (a common error). if response is None: if isinstance(callback, types.FunctionType): # FBV view_name = callback.__name__ else: # CBV view_name = callback.__class__.__name__ + '.__call__' raise ValueError("The view %s.%s didn't return an HttpResponse object." % (callback.__module__, view_name)) # If the response supports deferred rendering, apply template # response middleware and the render the response if hasattr(response, 'render') and callable(response.render): for middleware_method in self._template_response_middleware: response = middleware_method(request, response) response = response.render() except http.Http404 as e: …... return response
从上段代码中可以看出来
request执行的过程是
解析url。调用请求中间件过滤请求。
如果响应处理。那么直接返回响应结果
如果不响应处理
解析url得到view。调用view中间件过滤。
如果还没有得到响应
那么调用转化得到view类或者view响应方法
调用view的渲染方法得到response
最后调用返回response中间件过滤处理
返回response
流程上解析完以后。具体查看中间件部分。文件夹结构
middleware |----__init__.py |----cache.py 缓存处理 |----clickjacking.py 框架跨站保护 |----common.py 公共部分 |----csrf.py csrf保护 |----doc.py 头信息中添加xView,具体作用未知 |----gzip.py gzip压缩 |----http.py 如果有Etag或者修改时间标记。做一些响应处理 |----locale.py 多语言处理 |----transaction.py 交易中间件,如果发生异常,数据库将回滚