django.core.handlers

https://www.cnblogs.com/ajianbeyourself/p/3645265.html

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

 

由代码我们知道

django把middleware分为了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包裹在一起,并且按照上面的顺序进行处理,这样的好处是:

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

完整的流程图如下

              

 

add by zhj:第二段代码有修改
原文:http://www.cnblogs.com/gaott/archive/2012/02/28/2371181.html

前言

Django是一个开放源代码的Web应用框架,她像一个工具箱,包括了整个web开发中的各种技术,例如ORM,Template等。这是在阅读django的源码中作的笔记。

首先需要简要介绍以下WSGI。

WSGI

基本概念
wsgi是Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。 在此接口中有两个方面,一个web应用程序类比java中的war包,一个是web服务器类比tomcat,apache。在这里我们只关注web应用程序。 参考http://www.python.org/dev/peps/pep-0333/

在此接口中定义了一个服务器和应用程序通信的方法:

#file:  app.py
def simple_app(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']

服务器传递两个参数:environ,start_response到我们的应用程序中,我们根据自己的业务逻辑处理后, 调用start_response返回相应代码和响应头信息,并在方法的最后返回相应的内容。假设将此app.py部署在 服务器上,那么用户访问时,服务器将会返回 Hello world 字符串,并带着相应头信息。

实例
此处我们建立了一个应用程序也就是app,为该app创建一个view,另外值得注意的是middleware。 middleware和app是类似的东西,只不过它对于app的view实现了一个decorator的模式,看代码就明白了。

import eventlet.wsgi

def view_def(env, response_call):
    status = '200 ok'
    response_headers = [('Content-type', 'text/plain')]
    response_call(status, response_headers )
    return 'hello '

class handler(object):
    def __init__(self, view):
        self._view = view

    def __call__(self, env, start_response):
        pre_middle = pre_middle(self._view)
        view_res = self._view(env, start_response)
        post_middle = post_middle(self._view)
        res = "%s %s %s" %(pre_middle.res,view_res,post_middle.res)
       
        return res

class pre_middle(object):
    def __init__(self,view):
        print 'before app process...I run'
        self.res = "pre middle.."

class post_middle(object):
    def __init__(self,view):
        print 'after app process...I run too'
        self.res = "..post middle"

        

        
    

port = 1234
sock = eventlet.listen(('0.0.0.0', port))
handler_instance = handler(view_def)
eventlet.wsgi.server(sock, handler_instance)

代码思路: 创建一个view(view_def),给view包裹Middleware(pre_middle、post_middle),然后开启一个服务器(eventlet)并监听1234端口,若有请求,那么系统的处理顺序是:

Request -> pre_middle -> view_def -> post_middle -> Response

运行结果
运行脚本:
在这里插入图片描述

在浏览器中浏览http://0.0.0.0:1234/可以看到以下效果
在这里插入图片描述

后台输出:
在这里插入图片描述

验证了我们的想法。

Django内置的server主要包括两部分:django.core.servers和django.core.handlers。其中,django.core.servers提供了一些用于开发和测试的server模块,而django.core.handlers是用于处理请求和响应的模块。 在具体实现上,Django使用了WSGI(Web Server Gateway Interface)来处理HTTP请求和响应。WSGI是Python的一种Web服务器和Web应用程序之间的标准接口。在Django中,可以通过django.core.wsgi模块来获取WSGI callable,这个callable可以作为Web服务器的入口来处理请求。 另外,Django还使用了servers.basehttp模块来提供WSGI服务器的一些基础功能。这个模块其实就是对Python内置的WSGI模块simple_server的一层包装。其中,WSGIServer用于启动WSGI服务器,ServerHandler用于处理请求,WSGIRequestHandler用于处理WSGI请求。 综上所述,Django的server主要通过WSGI来处理请求和响应,并提供了一些模块和类来实现这个功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Django源码分析之server](https://blog.csdn.net/weixin_34214500/article/details/90655389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值