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. 使用tcpcopy拷贝线上流量压测测试环境

    tcpcopy项目地址:https://github.com/session-replay-tools/tcpcopy 作者地址:http://blog.csdn.net/wangbin579 1:环 ...

  2. tomcat7需要进行升级,因为有漏洞,而且安装包没有做过优化处理

    http://www.open-open.com/lib/view/open1401931407228.html http://www.cnblogs.com/ggjucheng/archive/20 ...

  3. JavaScript过滤除连续的数字

    if (!Array.prototype.forEach) { Array.prototype.forEach = function (callback, thisArg) { var T, k; i ...

  4. 进程间通信(IPC)介绍

    进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量.共享存储.Socket ...

  5. HTTP - GET和POST的区别

    网上有很多文章介绍这两种HTTP请求的区别,我也不懂,主要还是看了一些文章,在这里写下一些笔记. 语义不同 在HTTP协议中,最初规定GET是用来查询或者获取资料,只读,POST用于修改数据,可写.因 ...

  6. CSS层叠样式表的层叠是什么意思(转自知乎)

    转自知乎上的回答:http://www.zhihu.com/question/20077745 解答一: 层叠指的是样式的优先级,当产生冲突时以优先级高的为准.1. 开发者样式>读者样式> ...

  7. 【网络编程】——windows socket 编程

    测试demo #include <winsock2.h> #include <stdio.h> #include <string.h> #include <s ...

  8. c++中的##和#的区别

    ##是一个连接符号,用于把参数连在一起 #是“字符串化”的意思.出现在宏定义中的#是把跟在后面的参数转换成一个字符串 #define paster( n ) printf( "token & ...

  9. 第一篇HBuilder在这里!

    本文作为一个引子,所有相关文章,都会在这里做一个索引,现在还空着.谢谢

  10. Cubieboard2裸机开发之(四)定时器操作

    前言 在Cubieboard2裸机开发之(三)里用到了一个延时函数delay,它的延时时间是不精确的,因此为了能够精确延时,就需要定时器的配合.定时器可以精确延时的一个重要原因是它的计时时钟(或者说频 ...