##language:zh #pragma section-numbers on ::-- ZoomQuiet [<>] <> ## 默许导航,请保留 <> = Django架在Twisted上 = 最近打算把Django架在Twisted上面,虽然Django的web site上中有一个已实现的方案,但是该方案只是实现了请求的转发,没有支持Defer的功能,所以,打算自己看一下。把看的过程中,整理出来的一些东西放在这里,希望各位不吝赐教。(这里好像不能贴图) {{{ BaseServer --> BaseRequestHandler | | TCPServer StreamRequestHandler | | HTTPServer BaseHTTPRequestHandler ----------------------------------------------------------------------------------------- | | BaseHandler | | | WSGIServer WSGIRequestHandler -----------> ServerHandler -----> WSGIHandler (从上到下是继承关系,虚线下是Django的) }}} == 1.1. 说明: == === 1.1.1. BaseServer: === 他实现了最为基本的Socker服务器,实现了监听。他通过handle_request()定义了最基本的请求处理流程。 在handle_request()内部,首先被调用的是get_request(),该方法通过accept()进行请求监听,请求到达后,该方法返回request实例。 之后被调用的是verify_request(),用于验证请求的正确性,例如是否符合某个规范。 之后的是process_request(),在这里,服务器可能会进行一些进程创建,线程创建或者其他的一些操作。 最后的是finish_request(),该方法通过调用BaseRequestHandler的handle()方法,将请求转到具体的请求处理过程当中。通过把请求的处理和线程创建等操作分离,可以最大限度的提高模块的重用。 === 1.1.2. StreamRequestHandler: === 将请求和响应,转化成了一个文件类型的实例,这样做的目的是为了使得基于TCP和UDP的请求,都能以一种一致的方式得到处理。 === 1.1.3. BaseHTTPRequestHandler: === 该类主要用于实现HTTP规范,在她的handle()方法内部。他通过process_request()来创建请求实例,他利用mimitools.Message将基于文本的请求,按照HTTP规范进行解析。之后根据请求的方法,调用对应的do_XXX()方法。在do_XXX()内部,通过self.headers来取得请求头,self.server来访问服务器实例,... == 1.1.4. Django部分 == === 1.1.4.1.manage.py === 我们通过python manage.py runserver 8080来启动服务器,这里实际调用的是django.core.management.py中的runserver()方法。该方法所完成的工作就是创建了一个AdminMediaHandler(),AdminMediaHandler包裹了一个WSGIHandler实例,在AdminMediaHandler内部,他根据请求的URL格式进行分类,如果请求的是非管理员页面中的内容,则将请求转发到WSGIHandler。 在创建了AdminMediaHandler实例之后,runserver()继续调用django.core.servers的 run()方法,该方法完成了以下几个事情:一、创建了一个WSGIServer()实例,并且将 WSGIRequestHandler设为该Server的BaseRequestHandler,二、将AdminMediaHandler实例 设为该Server的app,三、启动服务器。 === 1.1.4.2.继承自HTTPServer === 由于WSGIServer继承自HTTPServer,所以当请求到达后,她的BaseRequestHandle,即WSGIRequestHandler的handle()方法将会被调用,该方法创建了一个ServerHandler实例,在创建实例时handle()方法将请求,响应和环境变量都传入了该实例当中。而通过ServerHandler上的request_handler实例,ServerHandler可以访问到WSGIRequestHandler实例,从而向WSGIRequestHandler发送通知。在Djago的实现当中,这主要是用于进行日志记录。 创建了ServerHandler实例以后,她的run方法将会被调用,而在run方法当中,WSGIServer 的app实例,即1.1.4.1当中提及的AdminMediaHandler会同时被传入。 === 1.1.4.3.在ServerHandler === 在ServerHandler的run()方法内部,在进行了必要的环境变量初始化工作以后,ServerHandler会将请求转给AdminMediaHandler(),进而让WSGIHandler处理请求。 = 反馈 =