一、HTTPServer,RequestHandler,ServerHandler,Handler
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的更多相关文章
- vertx的HttpServer模块
Start HttpServer /** * 启动 HttpServer * multi instances 采用 synchronized防止线程安全问题 * addHandlers 方法是acto ...
- WSGI详解
WSGI接口 了解了HTTP协议和HTML文档,我们其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP响应的 ...
- vert.x学习(七),使用表单获取用户提交的数据
在web开发中,用的最多的就是表单了,用户通过表单提交数据到系统后台,系统又可以通过表单传递的数据做业务分析.那么这章就学习在vert.x中怎么使用表单,获取表单的参数值. 编写一个表单模板代码res ...
- vert.x学习(六),动态模板与静态文件的结合
这篇学习在动态模板里面引入css,把动态模板与静态文件结合起来使用. 编写DynamicReference.java package com.javafm.vertx.helloworld; impo ...
- vert.x学习(五),用StaticHandler来处理静态文件
做web开发,css.js.图片等静态资源是必不可少的,那么vert.x又是怎么来加载这些静态资源呢.请看StaticHandler 编写HelloStaticResource.java packag ...
- vert.x学习(四),使用模板解析器ClassLoaderTemplateResolver
在vert.x中使用模板解析,可以为我们带来很多方便.我这里学习了一下ClassLoaderTemplateResolver的简单使用.这次工程配置与上篇一样,不需要做任何多的配置.直接编写代码就可以 ...
- vert.x学习(三),Web开发之Thymeleaf模板的使用
在vert.x中使用Thymeleaf模板,需要引入vertx-web-templ-thymeleaf依赖.pom.xml文件如下 <?xml version="1.0" e ...
- vert.x学习(二),使用Router来定义用户访问路径
这里需要用到vertx-web依赖了,依然是在pom.xml里面导入 <?xml version="1.0" encoding="UTF-8"?> ...
- 使用Vert.x构建Web服务器和消息系统
如果你对Node.js感兴趣,Vert.x可能是你的下一个大事件:一个建立在JVM上一个类似的架构企业制度. 这一部分介绍Vert.x是通过两个动手的例子(基于Vert.x 2.0). 当Node.j ...
- 【7】使用css/js/html模板来实现一个注册、登录和管理的功能
分支:auth static添加文件 css文件夹: app.css 自定义css样式[*] bootstrap.min.cs bootstrap样式 compomemts文件夹: 插件用 ...
随机推荐
- Linux安全事件应急响应排查方法总结
Linux安全事件应急响应排查方法总结 Linux是服务器操作系统中最常用的操作系统,因为其拥有高性能.高扩展性.高安全性,受到了越来越多的运维人员追捧.但是针对Linux服务器操作系统的安全事件也非 ...
- android 常用类
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自[张鸿洋的博客] 打开大家手上的项目,基本都会有一大批的辅 ...
- Linux 统计某个字符串出现的次数
要统计一个字符串出现的次数,这里现提供自己常用两种方法: 1. 使用vim统计 用vim打开目标文件,在命令模式下,输入 :%s/objStr//gn 即可 2. 使用grep: grep -o ob ...
- css 单位转换
如今 css 的单位越来越多了,px, em, rem, 微信的小程序又出来个 rpx 可以用 less 自动生成需要的单位 但当你只是想把一个已有的页面转换成小程序时,可能更需要一个 px -> ...
- Django模块学习- django-pagination
实在是很简单的一个Django 的分页插件. 使用pip instal pagination 即可完成安装. 完成后配置如下: 1. 将安装文件中的 pagination 文件夹拷贝到项目的根目录下 ...
- GitHub上排名前100的Android开源库介绍(来自github)
本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...
- gitignore for vs
*/**/bin/Debug*/**/bin/Release*/**/obj/Debug*/**/obj/Release*/**/x86/Debug*/**/x86/Release*/**/x64/D ...
- Android WebView Demo
activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android& ...
- PHP 常用获取路径代码
<? //获取当前的域名: echo $_SERVER['SERVER_NAME']; //获取来源网址,即点击来到本页的上页网址 echo $_SERVER["HTTP_REFERE ...
- SAP ECC CO 配置
SAP ECC 6.0 Configuration Document Controlling (CO) Table of Content TOC \o \h \z 1. Enterprise Stru ...