1. 整体描述
quxite由如下模块构成:
核心处理模块: publish.py
处理url解析的directory.py模块
处理请求体解析的 request.py模块
处理session的session.py
处理form的form.py 和 widget.py
其他的ptl,html,server的目录,及 config.py,logger.py.util.py及等等其他的,都属于功能性的模块,
2.publish.py
要搞清楚publish.py 首先要搞清楚,quixote 对请求的处理从何处开始.
以scgi为例:
apache通过sgci模块的配置,把对应的请求交由scgi模块处理, scgi模块作为客户端把请求发往scgi的服务端.
scgi服务端已由scgi1.14提供实现 ,quixote的server/scgi_server提供了服务端的quixote_handler的实现,scgi的服务端以进程的方式工作,请求到来时,scgi服务端的父进程,会根据情况,fork出子进程对请求进行处理,默认最多fork出5个,超过5个并发的请求就排队等待,这样,每个子进程都会生成一个quixote_handler的实例,每个quixote_handler的实例,又会生成一个 publisher 的实例,意味着: 五个进程里,有5个publisher,就有5个sessionmanager...
当使用quioxte 框架时,首先需要我们编写一个服务程序,把上面的 提到的 scgi1.14对服务端的实现,quixote本身对handler的实现,及我们的初始Directory实现进行整合, 代码一般如下:
start_scgi.py:
#! /usr/bin/env python
#coding=utf-8
import quixote
import sys
from quixote import enable_ptl,get_session_manager
from quixote.publish import Publisher
from quixote.config import Config
enable_ptl() #启动ptl
sys.path.append("/home/shone/Public")
def create_publisher():
from webroot.ui.index import RootDirectory
return Publisher(RootDirectory(),logger=None)
if __name__=='__main__':
reload(sys)
sys.setdefaultencoding('utf-8')
from quixote.server import scgi_server
scgi_server.run(create_publisher,port=4000,script_name='')
命名为start_scgi.py ,在终端键入: python start_scgi.py 即可作为服务端接受scgi模块发送的请求.
process()方法:
接受请求后的第一步就是交给Publisher类的process(self, stdin, env)方法, 该方法根据stdin(对应请求输入流),和env(请求进程的环境变量)生成一个quixote的Request对象,
process_request()方法:
然后以此request为参数调用: process_request(self, request): 方法. 该方法是Publisher类的核心.
a.把request 参数赋值给Publisher实例的request 实例变量.
b.调用parse_request方法,把request中接受到的请求内容(stdin,env),拆解成: cookie, form 参数(包含url参数),server 参数(ip,host,content_length等等,等等)分门别类的放到request实例的各实例变量中备用。
c.调用以request为参数调用try_publish方法,返回response中的output内容。
d.根据output生成response ,把response 返还给scgi的服务端,再返回给scgi模块,再返还给用户浏览器。
至此,由请求到回应的过程走完。。
下一步,分析try_publish方法,,待续