zoukankan      html  css  js  c++  java
  • django源码笔记-【2】(转)

    add by zhj: 在原文的基础上有修改

    原文:http://www.cnblogs.com/gaott/archive/2012/02/28/2371238.html

    上一期完理解了WSGI处理思路,现在看看django是如何实现这个接口的。

    django.core.handlers

    在此模块中着重看两个文件:base.py, wsgi.py

    首先从宏观上看主要涉及到的类:

    而当我们运行了manage.py runserver后,将会生成一个进程来运行WSGIHandler实例,来响应用户的请求,其实WSGIHandler就是一个上篇提到的handler。

    好了,现在关键就是WSGIHandler的__call__方法。

    WSGIHandler.__call__

    代码如下(可现暂时略过):

    def __call__(self, environ, start_response):
            from django.conf import settings
    
            # Set up middleware if needed. We couldn't do this earlier, because
            # settings weren't available.
            if self._request_middleware is None:
                self.initLock.acquire()
                try:
                    try:
                        # Check that middleware is still uninitialised.
                        if self._request_middleware is None:
                            self.load_middleware()
                    except:
                        # Unload whatever middleware we got
                        self._request_middleware = None
                        raise
                finally:
                    self.initLock.release()
    
            set_script_prefix(base.get_script_name(environ))
            signals.request_started.send(sender=self.__class__)
            try:
                try:
                    request = self.request_class(environ)
                except UnicodeDecodeError:
                    logger.warning('Bad Request (UnicodeDecodeError): %s' % request.path,
                        exc_info=sys.exc_info(),
                        extra={
                            'status_code': 400,
                            'request': request
                        }
                    )
                    response = http.HttpResponseBadRequest()
                else:
                    response = self.get_response(request)
            finally:
                signals.request_finished.send(sender=self.__class__)
    
            try:
                status_text = STATUS_CODE_TEXT[response.status_code]
            except KeyError:
                status_text = 'UNKNOWN STATUS CODE'
            status = '%s %s' % (response.status_code, status_text)
            response_headers = [(str(k), str(v)) for k, v in response.items()]
            for c in response.cookies.values():
                response_headers.append(('Set-Cookie', str(c.output(header=''))))
            start_response(status, response_headers)
            return response

    由代码我们知道

    djangomiddleware分为了5类,分别是:

    1. request_middleware

    2. view_middleware

    3. template_response_middleware

    4. response_middleware

    5. exception_middleware

       

    django通过类中的对应的方法判断属于哪个类别

    类别

    方法

    request_middleware

    process_request

    view_middleware

    process_view

    template_response_middleware

    process_template_response

    response_middleware

    process_response

    exception_middleware

    process_exception

    所以django的处理路径如下图所示:

     Request_middle → View_middleware → View → Exception_middleware → template_response_middleware → Response_middleware

     add by zhj: 右边这张图加入了Django Rest Framework的处理流程

     

    其实django就是使用一个WSGIHandler作为wrapper,将所有的app,middleware包裹在一起,并且按照上面的顺序进行处理,这样的好处是:

    思路清晰,利于代码的维护,便于代码的扩展,并且将各个相对独立的步骤分割开来,互补影响。

    完整的流程图如下

                  

  • 相关阅读:
    建模算法(九)——拟合 (转)
    Swift初探一
    D3DXMatrixMultiply 函数
    魔术师发牌和拉丁方阵
    strip 命令的使用方法
    GDI编程小结
    Android多媒体-MediaRecorder 录制音视频
    Android 使用Gson解析json案例具体解释
    有依赖的背包问题(背包九讲)
    c++ 正則表達式
  • 原文地址:https://www.cnblogs.com/ajianbeyourself/p/3645265.html
Copyright © 2011-2022 走看看