深入学习Django源码基础13 - Django中的中间件(middleware)

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


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值