Quixote 学习之二: 总体介绍和Publish模块初步分析

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方法,,待续

你可能感兴趣的:(apache,UI,框架,python,浏览器)