Django之HttpServer服务器分析详解

大家知道,软件的正向工程,是从软件的需求获取开始,大概经历需求分析,概要分析,领域分析,设计分析,详细设计,代码实现,部署,实施这几个步骤,最终交付给用户使用。而在某些时候,比如某个软件产品是用PHP开发的,因为某些原因,我们想移植到JAVA平台去。或者某公司看到某个软件的市场前景很好,想COPY它的主要功能,然后经过加工润色后推出一个具有相同功能,更好用户体验或更多功能的软件。或者单纯的以研究软件的结构、设计思想为目的。基于这些需求,我们需要逆向工程。正向工程是一个从过程导出结果的步骤,而逆向工程是从结果推导出过程,逆向工程从代码出发,最后的成果往往是分析模型,从分析模型,我们可以得到产品的设计思想。

Django是python的一个Web开源框架。在生产环境下,它通过wsgi接口与apache的mod_wsgi通讯,完成代码解析,根据url请求,执行相应代码并将返回结果通过http协议传输结果呈现给用户。在开发环境下,我们常常使用Django自带的webserver进行开发与调试。由此Django无需任何其它组件(如apache)的支持,就可以形成一个完整的基于python的web解决方案。

在此,我将与大家粗略的探讨一下Django是如何工作的,而研究的方法就是上面所提到的逆向工程。废话就不多说了,让我们开始。

要想知道Django是如何工作的,首先得研究下Django提供的Webserver。因为它是Http请求的入口,Http响应的出口。它接收用户在浏览器输入的URL,然后经过一系列复杂的操作,变成了用户想要的内容,并将内容通过Http发送给用户。所以,Webserver将是我们研究Django的切入点。

Webserver

包与类的关系结构图

Webserver所需要的类和包大致如上图所示(某些配置相关的类没有在上图中表示出来),由于Python语言的特性,在上图中我们看到的以.py后缀结尾的是python文件,我们也可以把它当作是一个package。以.class后缀结尾的代表类。虽然Django框架不是用完全面向对象的思想来开发的,但完全可以用面向对象的思想去分析它。下表将展示包的描述。

包名 父级包 在WebServer中起到的作用
BaseHTTPserver.py N/A 提供http请求处理类的包
contrib django 提供Django框架的一般性部件
handlers.py django.contrib 提供处理http请求类的包
staticfiles django.contrib 提供处理http请求类的包
management django.contrib.staticfiles 提供管理“处理http请求对象”类的包
commands django.contrib.staticfiles.management 提供管理“处理http请求对象”类的包
runserver.py django.contrib.staticfiles.management.commands 提供管理“处理http请求对象”类的包
core django 提供Django框架的引擎
handlers django.core 提供处理http请求核心类的包
base.py django.core.handlers 提供处理http请求核心类的包
wsgi.py django.core.handlers 提供处理http请求核心类的包
management django.core 提供管理“处理http请求对象”核心类的包
__init__.py django.core.management 提供管理“处理http请求对象”核心类的包
base.py django.core.management 提供管理“处理http请求对象”核心类的包
commands django.core.management 提供管理“处理http请求对象”核心类的包
runserver.py django.core.management.commands 提供管理“处理http请求对象”核心类的包
servers django.core
提供实现服务器运行类的包

提供处理http请求类的包

basehttp.py django.core.servers
提供实现服务器运行类的包

提供处理http请求类的包

SocketServer.py N/A 提供实现服务器运行类的底层包
提供处理http请求类的底层包
wsgiref N/A 提供实现服务器运行类的底层包
提供处理http请求类的底层包
handlers.py wsgiref 提供实现服务器运行类的底层包
提供处理http请求类的底层包
simple_server.py wsgiref 提供实现服务器运行类的底层包
提供处理http请求类的底层包

看似包很多,但仔细观察,我们会发现,包聚集的无非是运行http服务器、管理http请求、处理http请求这三种类,只是所在的层次不一样,SocketServer.py包与BaseHTTPserver.py包提供最底层的实现,wsgiref包提供过渡层的实现,django包提供应用层的实现。

包示意图

从上图看来,可能会对包的结构有一个更加直观的了解。WebServer的运行是由management包来驱动调度的。management包启动server,并等待tcp连接过来,management包还会创建一个request handle的实例。当有一个连接过来时,这个request handle实例会调用handle实例(也就是staticfilehandle对象)进行相应的逻辑处理,如加载视图中间件,模板中间件等一系列的操作,并将处理结果写入socket,发送给浏览器。从包图上我们可以了解系统模块间的交互关系,如果要更加深入的理解细节,我们需要对包中的类进行分析。下表将展示类的描述。

类名 所属包 父级 在WebServer中起到的作用
BaseHTTPRequestHandler BaseHTTPserver.py StreamRequestHandler request handle底层类
StaticFilesHandler
django.contrib

.staticfiles.handlers.py

WSGIHandler 处理http请求的实体,用户逻辑处理,产生http响应结果,属于handle模块
Command
django.contrib.

staticfiles.management

.commands.runserver.py

RunserverCommand 调度类,取得handle实体对象等
BaseHandler
django.core

.handlers.base.py

N/A handle基类
WSGIHandler
django.core

.handlers.wsgi.py

BaseHandler handle类,负责django框架handle的核心逻辑。
BaseCommand django.core.management.base.py N/A 调度基类
Command as RunserverCommand
django.core.management

.commands.runserver.py

BaseCommand 调度类,负责django框架调度的核心逻辑。
WSGIRequestHandler
django.core

.servers.basehttp.py


simple_server.

WSGIRequestHandler

request handle核心类
WSGIServer
django.core

.servers.basehttp.py


simple_server.

WSGIServer

建立http服务器
BaseRequestHandler SocketServer.py N/A request handle底层类,调用handle模块获取http响应,写入socket
BaseServer SocketServer.py N/A 建立http服务器
StreamRequestHandler SocketServer.py BaseRequestHandler request handle底层类
TCPServer SocketServer.py BaseServer 建立http服务器
BaseHandler wsgiref.handlers.py N/A request handle与handle模块之间的代理类,request handle通过该类调用handle对象
SimpleHandler wsgiref.handlers.py
wsgiref

.handlers.py.

BaseHandler

request handle与handle模块之间的代理类,request handle通过该类调用handle对象
WSGIRequestHandler
wsgiref

.simple_server.py

BaseHTTPRequestHandler request handle底层类
WSGIServer
wsgiref

.simple_server.py

HTTPServer 建立http服务器
HTTPServer BaseHTTPserver.py TCPServer 建立http服务器
ServerHandler
wsgiref

.simple_server.py

SimpleHandler request handle与handle模块之间的代理类,request handle通过该类调用handle对象

经过分析后,我们可以得出运行WebServer及处理Http请求所需的类静态图,通过类静态视图与分析调试,我们可以得出对象的时序图。我们可以将WebServer的监听及处理当作两个用例来处理,由此可以得出针对这两种不同用例的时序图,如下所示:

类的静态图

类的时序图

服务器运行时序图

处理请求时序图

至此,我们建立了Django框架中自带HttpServer的设计模型,有了设计模型,我们可以通过它反推出分析模型。如果我们以移植为目的(如需要做一个JAVA版的HttpServer),可以在得到分析模型后,再开始针对JAVA进行设计建模,然后进行代码编写。如果以优化裁剪为目的,我认为推导出设计模型已经足够了,可以开始思考如何精简类,如何裁剪项目。

Django之HttpServer服务器分析详解,布布扣,bubuko.com

时间: 2024-12-26 20:40:53

Django之HttpServer服务器分析详解的相关文章

django的crsf机制防御详解及在前后端分离中post数据到django-vue

django的crsf机制防御详解及在前后端分离中post数据到django 更新于: 2018-07-28 |  分类于 django CSRF(Cross Site Request Forgery) 跨站点伪造请求 某个用户已经登陆了你的网站,另外有一个恶意的网站有一个指向你网站的链接,那么当用户点击这个链接时,就会请求你的网站,但是你的网站以为是用户发来的请求,这时恶意网站就得逞了. django的应对措施 用户在post请求时,发送给用户一个token,然后在django内部实现了一个校

[转]Linux操作系统tcpdump抓包分析详解

PS:tcpdump是一个用于截取网络分组,并输出分组内容的工具,简单说就是数据包抓包工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为Linux系统下用于网络分析和问题排查的首选工具. tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具.tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息.因此系统中存在网络分析工具主要不是对本

Google Chrome抓包分析详解

Google Chrome抓包分析详解 一:什么是抓包 即抓取我们本地电脑与远端服务器通信时候所传递的数据包 二:Chrome浏览器讲解 Chrome 开发者工具是一套内置于Google Chrome中的Web开发和调试工具,可用来对网站进行迭代.调试和分析 三:打开Chrome开发者工具 在Chrome界面按F12 or在页面元素上右键点击,选择“检查” 四:开发者工具的结构 Elements(元素面板):使用“元素”面板可以通过自由操纵DOM和CSS来重演您网站的布局和设计. Console

wav文件格式分析详解

wav文件格式分析详解 文章转载自:http://blog.csdn.net/BlueSoal/article/details/932395 一.综述    WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的.RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是"RIFF".    WAVE文件是由若干个Chunk组成的.按照在文件中的出现位置包括:RIFF WAVEChunk, Format C

Linux下DNS服务器搭建详解

 Linux下DNS服务器搭建详解 DNS  即Domain Name System(域名系统)的缩写,它是一种将ip地址转换成对应的主机名或将主机名转换成与之相对应ip地址的一种机制.其中通过域名解析出ip地址的叫做正向解析,通过ip地址解析出域名的叫做反向解析. 下面对DNS的工作流程及原理进行简要说明 DNS的查询流程:需要解析服务的Client先查看本机的/etc/hosts:若无结果,则client查看本地的DNS缓存服务器:若无结果,则查找所属域的首选DNS服务器:若此时本地首选DN

Mysql Join语法解析与性能分析详解

一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1:左表:table2:右表. JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录. RIGHT JOIN(右连接):与 LEF

Linux系统环境搭建SVN服务器环境详解

Linux系统环境搭建SVN服务器环境详解: 本篇文章主要介绍的内容是在Linux系统下如何搭建SVN服务器的,目的是为了很好的实现代码版本控制管理,具体如下所示介绍: 一.安装需要的软件包 #yum install subversion     ---安装SVN服务工具 #yum install httpdmod_dav_svn mod_perl    ---用于支持WEB方式管理SVN服务 #yum install wgetmake unzip perl*       ---必备的软件包 二

Ubuntu系统配置BOA服务器图文详解

Ubuntu系统配置BOA服务器图文详解 [日期:2013-07-15] 来源:Linux社区  作者:dikcychen2011 [字体:大 中 小] BOA 服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的.适合于嵌入式系统单任务的http服务器,源代码开放.性能高.下载地址:http://www.boa.org/ 在PC上配置和移植到嵌入式系统思路是差不多的,关键是修改boa.conf文件,如编译器,还有创建相应的目录等.如果在PC上搞定,那在ARM板

Nginx搭建集群服务器过程详解

Nginx+Apache+PHP+MySQL搭建集群服务器过程详解 概念介绍在本文未能提及,请自助上网科普,直接进入过程详解: 集群架构图大致如下: 一.软件下载 序号 软件名称 软件版本 下载地址 1 操作系统 Windows Server 2008 Enterprise 64bit 2 Php php-5.6.19-Win32-VC11-x64 Thread Safe(由于HTTP服务器用的apache) http://windows.php.net/downloads/releases/p