分类: Python/Ruby
2009-08-04 14:08:50
-- oatil, eddyxu [2004-08-09 23:22:00]
mod_python是apache组织的一个项目,通过它,可以开发psp或cgi,mod_python功能强大,速度快,是非常优秀的web开发工具。
mod_python的一个最主要优点就是在性能上超越传统CGI。下面是一个非常粗略的测试。该测试是在一台运行Red Hat Linux 7.3的奔腾1.2G的机器上完成的。Ab 用来对4种脚本进行测试,所有的都是从标准cgi模块输入(因为这是一个典型Python cgi脚本开始的方式), 然后输出一个简单的单词"Hello!"。这个结果是基于10000次并发为1的请求。
Standard CGI: 23 requests/s Mod_python cgihandler: 385 requests/s Mod_python publisher: 476 requests/s Mod_python handler: 1203 requests/s
Apache分阶段的处理请求(比方说:读取请求,解析header, 检查存取路径,等等)。这些阶段能被称为"处理器"(handler)的函数实现。传统上, "处理器"是由C语言编写,并编译成Apache的模块。Mod_python提供了一个通过Python写的Apache处理器的来扩展Apache功能的方法。关于Apache请求处理过程的详尽描述,请参阅 Apache API Notes, 也可以参阅 Mod_python - Integrating Python with Apache。
为了轻松地从CGI移植,一个标准的mod_python处理器提供了模拟的CGI环境,允许用户在不对代码做任何修改的情况下,使遗留的脚本运行在mod_python下(大多数情况)。
See Also: http://dev.apache.org/ Apache Developer Resources Mod_Python - Integrating Python with Apache, presented at Python 10
Mod_python起源于一个被称为Httpdapy(1997)的项目。很长时间以来, Httpdapy并没有被称作mod_python,因为Httpdapy不是专门用于Apache的。 Httpdapy被设计成跨平台的,实际上最初是为Netscape server写的(那个时候被称为Nsapy)(1997)
这个Httpdapy的README文件的摘要,很好的阐述了在HTTP server中嵌入Python所带来的挑战和解决方案。
注意:得到关于安装和其他问题帮助的最好地方是mod_python的邮件列表。请花几分钟,发送一封主题为"subscribe" 的e-mail至mod_python-request@modpython.org, 加入mod_python的邮件列表。
Python 2.2.1或以后版本。Python的早期版本将不能工作。
Apache 2.0.40或以后版本(对于Apache 1.3.x版本,请使用mod_python 2.7.x版本)
为了编译mod_python,你将需要Apache和Python的包含文件(include files),也包括安装在你系统上的Python 的库。如果你是从源码安装的python和Apahce,那么你已经有了所需要的一切。但是,如果你是使用预打包(prepackaged)的软件(比如,Red Hat Linux RPM, Debian, 或者从sunsite得到的Solaris packages,等等),那么很可能你的系统里只有二进制文件而没有源文件。通常,编译mod_python所需要的Apache和Python得包含文件和库文件是分离的"开发"包的一部分。如果你不确定你是否有所有需要的文件,或者从源码编译和安装Python和Apache,或者参考你系统中关于如何得到开发包的文档。
有两种方法将模块编译并连接到Apache -- 静态的,或者作为DSO(Dynamic Shared Object).
DSO是mod_python现在更流行的并且被推荐的方法。模块被编译为一个共享库,在运行时有服务器动态装入。
DSO的好处是模块安装时不需要重新编译Apache,并且需要时再使用。关于Apahce DSO机制更详尽的描述, .
现在mod_python只支持DSO。
静态连接是一种较老的方法。随着动态连接在大多数的平台上的实现,它被越来越少的用到。它主要的缺点是需要重新编译Apache,在很多情况下这可不是一个好的选择。
./configure脚本将分析你的环境,并且创建为你系统特别定制的Makefiles。除了所有标准autoconf所做的以外,./configure还要作如下的工作:
检查一个被成为apxs的程序是否可用。这个程序是标准Apache分发包的一部分,并且也是编译DSO所必需的。如果在你的PATH目录或者/usr/local/apache/bin目录下无法找到apxs,那么DSO的编译将无法进行.
你可以通过--with-apxs选项,手动指出apxs所在目录,比如:
$ ./configure --with-apxs=/usr/local/apache/bin/apxs
推荐你指定该选项。
检查你的Python的版本,并试图通过参看编译到你的Python二进制文件中的不同参数,判断libpython的位置。通常,它会用到在你的PATH目录中所找到的python程序。如果在这些目录中所找到的Python二进制文件不合适,或者不是mod_python所期望的,你可以通过--with-python选项,指定一个供选择的位置,例如:
$ ./configure --with-python=/usr/local/bin/python2.2
开始编译,只要简单的输入命令
$ make
这部分安装需要以根用户(root)身份进行。
$ su # make install
这会简单的将库文件拷贝到你的Apache libexec目录下,其他所有的模块均在这里。
最后它将安装Python的库文件到site-packages目录并且编译它们。
注意: 如果你希望选择性的仅仅安装Python库文件或者仅安装DSO(这可能不总是需要超级用户权限),你可以用如下的make目标:install_py_lib and install_dso
如果你将mod_python编译成DSO,那么你需要通过在Apache的配置文件(通常称为httpd.conf 或者 apache.conf)里面加入如下一行,来载入模块:
LoadModule python_module libexec/mod_python.so
mod_python.so的实际路径可能会变化,但是make install在近结束时会报告mod_python.so的位置和目录的形式。
使你网站上的某些目录可见,比如,htdocs/test
在主配置文件或者.htaccess中加入下面几句话。如果你准备使用.htaccess,你就不需要
AddHandler mod_python .py PythonHandler mptest PythonDebug On
(将上面的/some/directory替换成你系统中有效的目录,通常是你Apache的)
如果你改变了主配置文件,你需要重启Apache,以使这些改变生效。
编辑htdocs/test中的mptest.py文件,使其有如下的代码(从你的浏览器剪切和粘贴的时候要小心,可能会产生错误的缩进和符号错):
1 from mod_python import apache
2
3 def handler(req):
4 req.write("Hello World!")
5 return apache.OK
将你的浏览器指向mptest.py所在的URL; 你将会看到"Hello World!". 如果你没有看到这些,请参阅下一节"故障排除".
如果一切顺利,请前进到第三章《指南》。
你可以尝试从如下方面确定问题所在
如果有错误输出,仔细研究之
检查服务器的日志文件,它可能含有有用的线索
尝试从命令行方式单进程的执行Apache
./httpd -X
这防止它在后台运行,并可以提供一些有用的信息。
在mod_python的邮件列表上咨询。确保包含如下特定的信息。
Mod_python版本
你的操作系统的类型,名称,版本
你的Python的版本,以及任何不寻常的编译选项
你的Apache的版本
Apache配置文件(.htaccess)相关的部分
Python代码中相关的部分
现在通过前一章的学习,我们已经学会并安装好mod_python,现在可以通过快速阅读本章进入程序开发阶段。 我强烈推荐你在阅读完本章以后接着阅读(至少是前面的部分)第4章python API的内容。
这一节为我们提供了一个快速的关于发布处理器的概况,从而使我们可以不用关注太多的细节就可以写出程序。在这本指南的最后一节,会有一个更详细全面的关于mod_python处理器如何工作的讲解。
发布处理器是mod_python的众多标准处理器中的一个,为了使你的发布处理器能够正常工作,需要在你的配置文件(通常是httpd.conf)中加入下面几句话:
AddHandler mod_python .py PythonHandler mod_python.publisher PythonDebug On
(注意:D:/apache/Apache2/cgi-bin/oa是我的机器上的路径)
接下来的这个例子展示了一个简单的返回表单,这个表单询问用户的名称,电子邮箱,地址和意见,然后发送一封电子邮件给网络管理员,信的内容就是用户填写的意见。这个简单的程序包括两个文件:form.html---用来收集数据,form.py---表单的action指令发送的目标。
下面是form.html的代码:
请填写下面的回馈表单:
注意