首页->正文

编写web服务器学Python之三

2011-05-18 -Web开发 标签: python

本节概要
1. HTTP头部信息Last-Modified及Expires的使用
2. 增加记录访问日志功能
3. 模块化:通过import导入自己编写的模块

首先分析原程序的结构
1、处理请求的方法中存在大量定义的变量,每请求一次都需重新赋值。解决方法是把一些共用的变量以及一些文件句柄的打开定义在启动阶段,以方便函数中直接调用;
2、解析url、读取文件、发送内容等功能都写在一个方法中,随着web服务器功能的增加此方法的代码量会越来越大,导致结构过于臃肿。这点上我们可以通过导入功能import进行功能划分,把Header内容的解析、文件的类型及内容读取分别写到单独的文件中,从而实现结构的简化。

其次要实现的功能用到的知识点
1 Last-Modified作用,简单说就是一个时间戳,浏览器访问某个页面时会记录下页面的修改时间(前提是服务器得发送此头信息),之后在二次请求这个页面时发送If-Modified-Since头信息,这时服务器会根据这个信息和文件的修改时间进行比较,如果相等就直接返回304 Not Modified,通知浏览器此页面未发生过修改,可以直接调用浏览器本地的缓存信息,避免了body内容的发送。Expires则更进一步,它会设置一个过期时间告诉浏览器这个时间之前都可以调用本地的缓存内容而无需请求,例如点击浏览器的前进或者后退以及页面中访问过的链接时(F5刷新会无视Expires重新返回内容,但有可能返回304 Not Modified,这时可以用Ctrl+F5不发送If-Modified-Since,从而通知服务器重新返回内容)
2 服务器访问日志的记录
上一节中我们已经获取到了客户端的ip,同时也知道请求的头信息中会包含浏览器标识User-Agent,在加上请求的地址、方法、状态,完全可以实现apache访问日志的内容格式。

具体代码从这里下载(7z格式,无法解压的话试试http://www.7-zip.org/download.html),主程序中对主要代码进行了注释,这里就不一一解释了。

以下概要说明新引入的语法特征
# coding=utf8可以设置当前文件的编码格式,推荐用utf8,当然文件也需要保存为utf8格式的;
.通过class关键词来定义类,类里面包括各个方法(函数)def,注意方法中的第一个参数self。通过import方式导入类,注意类的名称和保存文件名的一致。另外import导入的类(或函数)要通过前缀的方式访问,例如import httpCore后,可以通过httpCore.getFileInfo来访问httpCore.py中定义的getFileInfo()函数,变量同样要通过此种方式访问;
.通过%&的方式输出字符串显的更python化,如:
outputHeader = 'HTTP/1.1 %s %s\r\n' % (httpHeaderStat, httpCore.httpStatusList[httpHeaderStat])
.文件的写入:
logFile = open(logFilename, 'a', 0)
a标识符表示以append(附加)方式写入文件,0表示不缓冲写入内容,而是直接写入磁盘(当然你还可以调用logFile.flush()直接刷新缓冲内容到磁盘)。更多详细的参数介绍见http://docs.python.org/library/functions.html#open
.通过try except捕获发生的异常,以保证异常下的处理。


扩展阅读
类的定义详细介绍: http://woodpecker.org.cn/diveintopython/object_oriented_framework/defining_classes.html
import详细介绍及存放类文件路径的问题: http://woodpecker.org.cn/diveintopython/object_oriented_framework/importing_modules.html && http://www.cnitblog.com/seeyeah/archive/2009/03/15/55440.html
try except: http://docs.python.org/tutorial/errors.html(RTFM) 或者适合阅读的 http://woodpecker.org.cn/diveintopython/file_handling/ ~又是woodpecker,我不是在做广告啊:)

下一篇 Redis协议说明与解析--php篇

上一篇 PHP版本不同导致调用方法不存在

相关文章

编写web服务器学Python之一

编写web服务器学Python之二

编写web服务器学Python之Fastcgi

文章分类

开发小提示

  • 1:Mongodb中通过db.yourCollectionName. dataSize()查看某个文档的大小
  • 2:linux下用reset命令恢复查看二进制文件导致的命令行乱码
  • 3:查看MySQL表的索引情况show index from tableName
  • 更多...

交流

  • wangnow(a)126.com