::-- ZoomQuiet [2006-09-26 02:35:14]

CPUG联盟::

CPUG::门户plone

BPUG

SPUG

ZPUG

SpreadPython Python宣传

1. 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.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. 1.1.2. StreamRequestHandler:

将请求和响应,转化成了一个文件类型的实例,这样做的目的是为了使得基于TCP和UDP的请求,都能以一种一致的方式得到处理。

1.1.3. 1.1.3. BaseHTTPRequestHandler:

该类主要用于实现HTTP规范,在她的handle()方法内部。他通过process_request()来创建请求实例,他利用mimitools.Message将基于文本的请求,按照HTTP规范进行解析。之后根据请求的方法,调用对应的do_XXX()方法。在do_XXX()内部,通过self.headers来取得请求头,self.server来访问服务器实例,...

1.2. 1.1.4. Django部分

1.2.1. 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.2.2. 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.2.3. 1.1.4.3.在ServerHandler

2. 反馈