运行启动,定位到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 交易中间件,如果发生异常,数据库将回滚