1.      HTTPServer,RequestHandler,ServerHandler,Handler

1.1       基本概念

HTTPServer主要是对传输控制层HTTP,TCP,Socket等底层实现细节的一些抽象,典型应用为WSGIServer,其继承关系为: WSGIServer: HTTPServer: TCPServer: SocketServer.BaseServer,对应的类视图如下图:

RequestHandler是对HTTP请求所有操作的抽象,从其成员函数:headers, response, parse_request(), handle_one_request()等即可大致了解其主要工作内容,其典型的应用是WSGIRequestHandler,对应的继承关系为: WSGIRequestHandler: BaseHTTPRequestHander: StreamRequestHandler: SocketServer.BaseRequestHandler。对应的类视图如下:

ServerHandler是对程序运行环境进行抽象,如stdin, stdout, softversion, logging等,主要起辅助作用,其具体工作机制暂时不得知,其有一个重要的成员函数run(self, application),HTTPServer利用该成员函数调用不同的Handler处理不同的请求。

Handler是对URL请求进行处理的一种抽象,重点偏向上层应用处理,不同的URL请求可能需要不同的处理机制,因此需要定制多种不同的Handler,Handler实体对应Server的application成员,显然,虽然Server在初始化时赋值了该application成员(wsgi_handler),但是程序在运行过程中,随时可以动态调整该成员值以达到调用不同的Handler处理不同Request的目的。Handler的典型应用有staticfileHandler, WSGIHandler。前者的类视图如下图:

Handler实体中loadmiddleware(), get_response(), _get_response(), make_view_atomic()都是非常重要的成员函数,完成对http请求处理的绝大部分操作。

Django程序通常拥有一个HTTPServer实体,一个HTTPServer实体与一个RequestHandler关联,RequestHandler在handle请求时需要一个ServerHandler实体的支撑,一个ServerHandler实体调用HTTPServer实体对应的多个Handler中一个进行请求处理。

在Django框架中,WSGI协议是连接Django框架和外部web server的桥梁,起着非常核心的作用,因此在分析过程中通常直接分析WSGISserver,WSGIHandler,WSGIRequestHandler,而不再介绍更抽象的HTTPServer,Handler等,关于这些抽象类的更多应用可以在python目录的test文件夹找到。

1.2       类视图关系

WSGISserver,WSGIRequestHandler ,ServerHandler,WSGIHandler之间的关联关系如下图所示:

1.3       初始化及其调用关系

django.core.management.base.commands.runserver.py

from django.core.servers.basehttp import get_internal_wsgi_application, run
handler = self.get_handler(*args, **options) /* WSGIHandler 或StaticFilesHandler */
run(self.addr, int(self.port), handler, ipv6=self.use_ipv6, threading=threading)

django.core.servers.basehttp.py

def run(addr, port, wsgi_handler, ipv6=False, threading=False):
    httpd = WSGIServer(server_address, WSGIRequestHandler, ipv6=ipv6) /*初始化WSGIServer实体,并指定RequestHandler为WSGIRequestHandler */
    httpd.set_app(wsgi_handler)      /*指定applicaton为wsgi_handler */
    httpd.serve_forever()            /*启动服务,接受到来的请求,并处理之*/

注意,在RunserverCommand:Commond:get_handler()获取Handler时,根据配置参数不同,返回不同的Handler,即WSGIHandler 或者StaticFilesHandler。

if use_static_handler and (settings.DEBUG or insecure_serving):
    return StaticFilesHandler(handler)
return handler         /* WSGIHandler*/

一、HTTPServer,RequestHandler,ServerHandler,Handler的更多相关文章

  1. vertx的HttpServer模块

    Start HttpServer /** * 启动 HttpServer * multi instances 采用 synchronized防止线程安全问题 * addHandlers 方法是acto ...

  2. WSGI详解

    WSGI接口 了解了HTTP协议和HTML文档,我们其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP响应的 ...

  3. vert.x学习(七),使用表单获取用户提交的数据

    在web开发中,用的最多的就是表单了,用户通过表单提交数据到系统后台,系统又可以通过表单传递的数据做业务分析.那么这章就学习在vert.x中怎么使用表单,获取表单的参数值. 编写一个表单模板代码res ...

  4. vert.x学习(六),动态模板与静态文件的结合

    这篇学习在动态模板里面引入css,把动态模板与静态文件结合起来使用. 编写DynamicReference.java package com.javafm.vertx.helloworld; impo ...

  5. vert.x学习(五),用StaticHandler来处理静态文件

    做web开发,css.js.图片等静态资源是必不可少的,那么vert.x又是怎么来加载这些静态资源呢.请看StaticHandler 编写HelloStaticResource.java packag ...

  6. vert.x学习(四),使用模板解析器ClassLoaderTemplateResolver

    在vert.x中使用模板解析,可以为我们带来很多方便.我这里学习了一下ClassLoaderTemplateResolver的简单使用.这次工程配置与上篇一样,不需要做任何多的配置.直接编写代码就可以 ...

  7. vert.x学习(三),Web开发之Thymeleaf模板的使用

    在vert.x中使用Thymeleaf模板,需要引入vertx-web-templ-thymeleaf依赖.pom.xml文件如下 <?xml version="1.0" e ...

  8. vert.x学习(二),使用Router来定义用户访问路径

    这里需要用到vertx-web依赖了,依然是在pom.xml里面导入 <?xml version="1.0" encoding="UTF-8"?> ...

  9. 使用Vert.x构建Web服务器和消息系统

    如果你对Node.js感兴趣,Vert.x可能是你的下一个大事件:一个建立在JVM上一个类似的架构企业制度. 这一部分介绍Vert.x是通过两个动手的例子(基于Vert.x 2.0). 当Node.j ...

  10. 【7】使用css/js/html模板来实现一个注册、登录和管理的功能

    分支:auth static添加文件 css文件夹: app.css    自定义css样式[*] bootstrap.min.cs    bootstrap样式 compomemts文件夹: 插件用 ...

随机推荐

  1. FoxMail的Bug

    Foxmail 7.2 build6.040,win7中文专业版 下载腾讯的企业邮箱的邮件, 自动配置为imap收邮件 收件箱应该为1740封 邮件 实际foxmail却只收到1500多封 改成pop ...

  2. ie8下jquery改变PNG的opacity出现黑边,ie6下png透明解决办法

    目前互联网对于网页效果要求越来越高,不可避免的用到PNG图片,PNG分为几种格 式,PNG8 PNG24 PNG32,其中最常用的,也是显示效果和大小比较适中的则是PNG24,支持半透明,透明,颜色也 ...

  3. Hermes实时检索分析平台

    一.序言 随着TDW的发展,公司在大数据离线分析方面已经具备了行业领先的能力.但是,很多应用场景往往要求在数秒内完成对几亿.几十亿甚至几百上千亿的数据分析,从而达到不影响用户体验的目的.如何能够及时有 ...

  4. BZOJ 4300: 绝世好题 动态规划

    4300: 绝世好题 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4300 Description 给定一个长度为n的数列ai,求ai的 ...

  5. 用C++为nodejs 写组件,提高node处理效率

    昨天研究了下如何用C++和node交互,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node. 首先,先来看看node ...

  6. QQ互联开发-01-开发者注册和网站应用申请

    首先需要申请网站应用 要想使用QQ互联,首先需要先注册一个开发者账号,使用QQ号码可以注册,注册后,就可以创建网站应用了: 通过下面地址:https://connect.qq.com/,我们去登录QQ ...

  7. c++标准库

    Technical Report 1不是正式的库只是一个草案,作为C++ 2003标准的附加库被大多数编译器厂商所支持,它是个过渡性质的库,其实现将会作为C++11标准的一部分.很多编译器对C++11 ...

  8. 关于把本地应用封装成windows app发布审核通不过的问题

    把传统的b/s系统,简单改版,做成了一个比较适合于领导查询的系统,并开发了一个app程序封装了webview直接导向该程序,无需登陆直接访问:结果在提交app的时候审核通不过,问题是安全审核失败: 大 ...

  9. BpBinder 转换为 BpCameraService 流程

    interface_cast<ICameraService>(binder) : 其中binder 为IBinder类型,实际为BpBinder interface_cast 定义在IIn ...

  10. 网站CSS选择器性能讨论

    CSS选择符由一些初始化参数组成,这些参数指明了要应用这个CSS规则的页面元素.作为一个网站的前端开发工程师,应该避免编写一些常见的开销很大的CSS选择符模式,尽量编写高效的CSS选择符,从而加快页面 ...