webpy源码分析
来源:互联网 发布:李刚疯狂java在线阅读 编辑:程序博客网 时间:2024/05/16 12:00
转载自 http://blog.csdn.net/agathe/article/details/7187564
一、源代码目录
application.py
应用层,web程序的启动入口,对urls映射与环境变量做初始化,添加请求预处理函数add_processer,这里实现了http请求处理的主回调函数wsgifunc(),分析url映射到对应的处理类并返回应答。
template.py
应用层,webpy中的模板功能。
from.py
应用层,webpy实现的表单功能。
session.py
应用层,实现session的管理,session是由cookies机制实现的,这里当然也不例外,具体的实现有机会再去研究。。。但在这里可以看到可供配置的session选项:
- 27 web.config.session_parameters = utils.storage({
- 28 'cookie_name': 'webpy_session_id',
- 29 'cookie_domain': None,
- 30 'timeout': 86400, #24 * 60 * 60, # 24 hours in seconds
- 31 'ignore_expiry': True,
- 32 'ignore_change_ip': True,
- 33 'secret_key': 'fLjUfxqXtfNoIldA0A0J',
- 34 'expired_message': 'Session expired',
- 35 'httponly': True,
- 36 'secure': False
- 37 })
db.py
应用层,提供访问数据库的操作,其实它就是对mysqldb进行的封装。我的程序中没有用到它,而是用的是sqlalchemy,操作起来更方便。
webapi.py
应用层,实现了操作config,header,input,cookies,HTTPERROR,Redirect的接口,还有服务器生成特定应答的接口,比如生成NOT found,404等错误的应答报文。
wsgi.py
中间层,应用层调用app run的时候会进入到这里,说它是中间层,因为运行模式的选择就在这里,它与上面的应用层和下面的网络层起到中间的纽带关系。运行模式就是runfcgi,runscgi,runsimple等,不同的方式,对应着不同的网络层实现。
httpserver.py
网络层,运行方式为cgi形式的网络层实现,它是基于Python已有的SimpleHTTPServer和BaseHTTPServer实现的。当请求/static/时直接返回文件内容,其它请求则调用指向application中wsgifunc()的handler。
wsgiserver/目录下
网络层,运行方式为独立程序时的网络层实现,wsgiserver.CherryPyWSGIServer是进入到这里的入口,CherryPyWSGIServer包括线程池的初始化,工作线程初始化socket并开始监听等操作。
wserver = wsgiserver.CherryPyWSGIServer(server_address, wsgi_app, server_name="localhost")
sgi_app即时指向应用层的handler,用于处理接收到的请求。
其它
utils.py
这个文件里实现了很多强大的功能,比如提供一些特殊数据结构,对字符串进行特殊操作等,暂且就叫它“基础元”吧。
net.py
提供测试ip,port是否可用,解决html/url等引用及安全编码问题。
http.py
提供判断网页过期、是否存在更新,对网页url前缀、query的一些操作。。。
二、程序结构与数据流程
1.webpy程序结构
webpy程序结构我分为了四个大部分:
开发者:开发者站在所有层的最上面,调用webpy提供的一些功能接口,实现自己的web站点。
应用层:对基于http协议的request进行解析,并实现了一些基本警告、error的应答格式,比如NOT FOUND,500应答报文,提供了session,form,template,db等http服务器基本功能的接口等。
中间层:这里负责运行模式的选择,也就是根据WSGI公共接口选择不同的底层实现,只在启动服务的时候用到。
网络层:接收发送数据,将数据送给应用层处理,再将应答发送给请求者。
如下是我对webpy程序理解的框图:
2.webpy数据流程
参见上图可以很清晰的看书webpy的数据流走向,当程序启动完毕,有新的request请求到来,首先接收网络socket数据,对request进行初步分析,调用wsgi_app指向的func,就是application中的wsgigunc()进行主要的业务处理,给出result后,再从上到下将data顺序返回,最后通过socket 发送出去。
其中有很多细节处理,我也没有仔细看,特别是网络层的代码,应用层中比较特殊的比如request的是/static/…路径下,则直接去读取该路径下的文件并返回,若没有该文件则返回NOT FOUND。在application的wsgifunc函数中,首先先执行注册在processers列表中的回调函数,然后再根据URL映射关系匹配到对应的类去执行,具体处理类的操作就是开发者自己要干的事了。比如连接db,解析from、利用template、运用session等。
- webpy源码分析
- webpy源码阅读--开篇
- webpy源码阅读
- 【Python】Webpy 源码学习(转)
- webpy
- webpy
- webpy
- webpy源码阅读(2)——CherryPyWSGIServer
- 读webpy源码-请求响应概述
- 读webpy源码-请求响应1
- 读webpy源码-请求响应2
- webpy源码阅读(1)——初见整体
- 【webpy】webpy笔记
- webpy浅谈
- webpy-简介
- webpy框架
- webpy 入门
- webpy框架
- jQuery添加/删除Select的Option项
- Nginx+Tomcat+Memcached实现tomcat集群和session共享
- system sys,sysoper sysdba 的区别 (转)
- nameidata路径查找辅助结构
- 用NodeJS打造你的静态文件服务器
- webpy源码分析
- Android 手动显示和隐藏软键盘 (转)
- TomCat的安装步骤
- 数字三角形
- 不言不语,都是好风景
- Baidu地图之浏览器定位
- 浅谈Java垃圾回收
- python 使用CppHeaderParser库 根据c++头文件生成html说明文档表格
- VS2010中创建安装项目(自定义安装类)