首先声明 本文 翻译 别人的文章,文章的作者是 mod_python 项目的负责人,目前 mod_python已由 Apache维护。原文地址:
http://www.onlamp.com/pub/a/python/2003/10/02/mod_python.html
用着自己蹩脚的英语翻译,可能说的有些不清楚,所以建议读者最好还是自己自己看英文原文。
什么是 Mod_python?
Mod_python 实际上做以下几件事:
• 一个内嵌了Python解释器(libpython)的Apache模块,使得Apache能够执行Python代码。
• 一个用于处理Apache特定范围的请求的程序,允许任何请求交给Python来实现。它允许Python实现过滤器和连接器。
• 它其实是Apache API的一个子集,它使得Python可以调用Apache内置的功能函数.通过它可以访问Apache服务器内部信息和使用Apache的工具比如日志。
•开发Web运用的工具的集合.它提供了很多标准的处理程序:发布,PSP,和CGI提供了另一种可供开发者选择的Web开发框架,以及一组实用对象和功能函数,用于处理cookie,sesiion的管理,和Web开发中常用的一些对象。
现在让我们详细的讲解这些。
在Apache中内嵌Python解释器
除了 mod_python .有两种方法,使得Apache可以执行Python代码。第一种是通过CGI模式,CGI是一个单独的进制,它将标准输出流(stdout)重定向到客户浏览器(有过Unix编程经验的应该了解,这里面用到了Unix中的execve系统。简单点说就是一个进程调P用了Python脚本Py,Py里面的标准输出也就是print出的结果,使用I/O重定向技术把print 出的结果输出到客户端浏览器)。第二种方法就是Apache服务器当作代理服务器,通过协议比如FastCGI或者其他私有协议将请求转发给Python运用服务器,运用服务器将处理结果返回给Apache,Apache再把结果反馈给用户(关于这种方式可以参看我之前的文章(Python Web初学解惑之 WSGI、flup、fastcgi、web.py的关系)。
CGI,目前为止支持最广泛的接口,但也是性能最低的。每个CGI请求都创建一个进程,并且每次Python解释器都要重新加载和初始化,导致不必要的CPU和I/O的活动。
第二种方法是将请求交给一个独立的运用服务器(一般是用Python编写),这钟方法比CGI性能更好并且用在很多流行的Python Web开发框架上(比如Webware)。这点和Java的非常相似。一个缺点就是增加了系统的复杂性。除了Apache你还得另外配置和运行一个运用服务器,增加了系统的管理开销和调试的复杂性。另一个缺点是,它没有运用Apache惊人的可扩展性和效率,请求的响应速度完全依赖于运用服务器处理请求的速度。
Mod_python通过在Apache中内嵌Python解释器解决了以上两种方法的弊端。Python代码可以直接在Apache服务器中运行,消除了需要额外创建进程或者运行服务器所带来的影响。同时,mod_python充分利用了Apache高度优化的能力来接受和处理用户的请求。这样带来的好处就是使得Apache成为一个平台可以比其他当前Python Web框架更加快速的处理用户的请求。
这里要说一下.现在存在着这样一个观点,考虑现在硬件发展的速度,如果可以通过扩展硬件达到满意的性能,就没必要过多的关注在优化软件上。简单说就是通过提高硬件设备得到目地,就没必要修改软件。在我的数GH的机器上CGI已经非常迅速了,为什么还需要mod_python?任何一个网站都有可能成为一个大量人访问的网站,由于并发访问量过大经常会出现无法访问的情况(臭名昭著的slashdot效应)。随着互联网的持续增长和日益丰富的内容,即使是当今最快的服务器也无法时刻满足需求。因此最大限度的使用硬件是非常值得的。
可以处理用户特定范围请求,过滤器和连接器
处理各种请求,过滤器,和连接器是Apache非常独特的特点,和一般常见的静态请求不同。如果你曾经编写过Java Servlets。你会发现Apache处理动态请求的方式和Servlet接口方法非常的相似。对于Apache不同类别的请求,每个模块都有注册相应的处理函数。比如,mod_auth_dbm注册用来处理认证类的请求,提供了用dbm文件来存储密码。
mod_python提供了让Python来编写注册各种请求的处理函数(也就是说Python针对不同的请求,编写不同的处理函数然后注册到mod_python中)。这是一个非常强大的功能,因为它开创了一种令人兴奋的使用Apache的方法。例如,你可以通过编写Python代码来实现认证或者处理用户的请求(或者发送一个日志到数据库,同时保持统计实时数据).
除此之外,mod_python还允许你使用Python实现过滤器,过滤器接受从服务器发送来的输出数据或者向服务器输入数据,同时还可以对数据进行修改。过滤器也可以组成过滤器栈,从上一个过滤器输出的数据被下一个过滤器处理。一个聪明的过滤器能够自动的发现一些股票代码并且将它们替换成指能够提供这些股票信息的网站。
最后,mod_python允许你创建连接处理器。一个连接处理器处理它接受到的连接,并且允许你绕过Apache处理。连接处理器常用来实现除了HTTP协议之外的其他协议。尽管这个特性已经被运用,但是它对实现一些用户自定义的协议或者一些要求系统性能非常高的地方 非常有用。很多之前用Apache代码开发用于高效处理大量连接的工作,利用mod_python连接处理器能够达到同样的效果比如日志,允许用户更多地关注与协议的处理。
Apache API接口
利用Apache API可以获取服务器各种信息和利用各种内置的功能设施。可用的服务信息包括 提供CGI可以处理的数据,各种有趣的字节数比如发送的字节数,服务器根目录,正在处理的请求,当前正在处理文件请求的文件处理器,等等。除此之外,Apache一些私有的信息比如配置树,正在使用的模块,一些模块的参数比如进程和线程的最大数量。
除了可以获取这些信息外,一些公开的API可以用来进行一些强大的操作,比如动态注册mod_python额外的处理器,创建内置的重定向,注册清理功能用于在请求完成后执行或者在服务器关闭之前进行清理工作。
Web开发工具集
早期版本的mod_python对web开发提供很少的工具。对于那些对Apache内部不感兴趣的开发者来,还有那些想要一个高效可扩展的用于开发Python的平台的开发者是很困难的。尽管 mod_python包含了发布处理程序,使用了一个非常聪明的方法,将URL映射到函数和Python模块对象(最初的灵感是受Zope's Zpublisher,当时成为Bobo)。它没有提供一个官方的用于处理cookie和session的方法。虽然后来提供了,但是非常的复杂主要原因是由于Apache的多进程架构,对于一个寻求平衡的程序员来说进程之间共享数据和加锁变得更加有挑战性。
幸运的是,在即将到来的3.1版本中得到改善。这次发布的版本包括了官方的cookie处理,支持加密的cookie(使用了HMAC),可以将可序列化简单对象放到cookie值里面。支持会话管理通过完全的随机生成的session id并且可以使用签名的cookie。会话信息可以直接存储在dbm文件中或者Apache进程运行的内存中。会话支持锁机制 使用Apache内置的全局互斥接口 提供了跨进程和线程的互斥(感觉这段讲的很别扭,我理解应该是 使用了操作系统里面的 互斥和信号量机制,可以了解一下Unix进程间通信)。Session类是可扩展的,用户选择使用持久化存储比如存储到数据库里面可以很方便的实现自己的session对象。
最后,3.1版本包括 mod_python自己实现的PSP(Python服务页面)。其实就是一个框架它允许在HTML页面中嵌入Python代码就像PHP,JSP,ASP。mod_python 核心的PSP解释器最初是由Sterling Hughes编写的,一个核心的PHP开发者。PSP解释器使用了flex(http://flex.sourceforge.net/),最快的扫描器和解释器之一。它可以和mod_python中其他功能完美结合比如session处理,成为最快的PSP实现之一。
mod_python的约束
mod_python唯一的约束就是它只能用在Apache上。mod_python运用移植到其他web server平台上并不容易。在我看来,无关紧要。因为Apache相对于其他Apache来说更加快速,并且很多平台支持。剩下的都是说Apache的好处了。
Mod_python is an ASF project
最后,我想说在发布3.0之前,mod_python是由Apache软件协会来管理的,并且成为Apache HTTP Server官方支持的项目。使得mod_python有很好的发展前景。mod_python正在稳定的发展并且越来越多的程序员开始注意到它作为一个稳定web运用开发平台。在Red Hat 9默认已经内置了mod_python。
(其实说了这么多,mod_python就类似与php5_mod。就是在Apache中内置了一个python解释器,和PSP解释器,Apache就相当于python的运行平台,所以Python可以获取Apache的各种信息。)
翻译感言:虽然读过很多英文文档 ,但是第一次翻译 英文文档,所以有些翻译很生硬。有时候自己懂了,但是要翻译的别人也懂那个意思真的很不容易。所以很佩服那些翻译国外计算机书籍的人,因为不仅英文要好,而且技术也要好,同时语言表达能力也很强。 如果英文水平好的话 还是看英文文档,如果大家对有些地方能够说的更好的话欢迎指出。
下一篇文章决定翻译 http://bitworking.org/news/Why_so_many_Python_web_frameworks (Why so many Python web frameworks?)……在毕业之前 决定翻译 最少10篇国外优秀的文章,如果大家有好的国外的关于 Java和Python的 优秀文章 可以共享出来。