第一章简介
1.1性能
使用mod_python的主要优势在于比传统CGI更高的性能。一个测试,使用在Pentium 1.2GHz的机器上运行Red Hat Linux 7.3。使用4种类型的脚本,基于标准的CGI导入模块(以典型的Python CGI脚本开始),然后输出'Hello!',测试10000次请求作为基准。
标准CGI: 23 次请求/秒
mod_python CGI处理器: 385 次请求/秒
mod_python 发布处理器: 476 次请求/秒
mod_python 处理器: 1203 次请求/秒
1.2可移植性
apache是按照阶段处理请求的(比如:读取请求、处理请求头、检查存取等)。这些阶段可以分别用处理器调用的函数来实现。传统上,使用C语言编写处理器模块。mod_python提供了使用Python拜你些apache处理器扩展apache功能的方法。更多的apache请求处理过程,参考"Apache API Notes",或者参考"Mod_python-Integrating Python with Apache"文件。
为了方便的从CGI移植,标准的mod_python处理器提供了CGI模拟环境,允许用户不修改遗留下来的脚本,而在大多数时候无需进行任何修改。
参考:
http://dev.apache.org
apache开发者资源
http://www.modpython.org/python10/
mod_python-整合Python和Apache,出现在Python 10(?)
1.3历史
mod_python起源于Httpdapy项目(1997)。很久以后Httpdapy才被叫做mod_python,因为Httpdapy并不是特定用于apache服务器的。Httpdapy设计成跨平台的,而实际上主要从Netscape服务器开始(追溯到1997年的Nsapy)。
摘录自Httpdapy项目的README文件的描述将Python嵌入到apache服务器的挑战与解决方法。
""" #小字体
在我多年前开发第一个WEB应用程序时就发现CGI访问数据库非常慢,因为每次点击请求都会装入解释器并执行数MB的数据。数据库往往都很大,并将大量时间浪费在数据库的连接/认证等"意义重大"的事情上,像DNS查询、编码与解码、内存分配等等。在应用提速的压力下,我尝试过使用Python和多种工具的综合使用。我并不迷信微软的ASP,又被Netscape的性能和满是臭虫而郁闷。"Cold Fusion"(冷聚变)看起来有希望,但我稍后学会了HTML类标签的书写方式,可读性跟汇编有一拼。比如PHP。但是我真的很想用Python来写东西。
就在同时有关Python互联网编程的书籍出版了,其中将Python嵌入到Netscape服务器的方式立即引起了我的注意。我在我的项目中使用了这个例子,并在稍后开发了我自己的改进版,叫做Nsapy,并在WindowsNT和Solaris上编译。
尽管Nsapy仅能工作在Netscape服务器上,但是出于灵活通用的面向对象设计,在Python精灵中,很容易移植到其他的WEB服务器。
后来,曾经流行的Netscape服务器挂了,我就将Nsapy移植到最流行的服务器apache上。所以从Nsapy衍生出了Httpdapy。
"""
继续这个传奇,你会想到将Httpdapy移植到其他服务器上,实际上他们比预想要复杂而且枯燥。
反之,提供一个类似于Perl语言的apache扩展mod_perl一样或更好性能的部件会更有意思。
俱往矣,mod_python的第一个版本发布于2000年5月。
完成...
第二章安装
注意:获得关于安装的帮助和其他问题的最好地方是mod_python的邮件列表。可以发送标题为"subscribe"的邮件到mod_python-request@modpython.org。
2.1先决条件
编译mod_python需要有apache和Python的包含文件,并且确保安装了Python标准库。如果你从源代码安装了Python和apache,那么你已经拥有了这些了。如果你使用了预打包软件,如RPM或其他方式则只有二进制版本,而没有源码。通常apache和Python的包含文件和库文件在各自的"development"包中。如果你不确定拥有这些重要文件,请从源码安装Python和apache,或者阅读你系统的文档以了解如何获得开发包。
2.2编译
有两种链接apache模块的方式:静态的和DSO方式。
DSO方式现在非常流行,并推荐用于mod_python的安装。模块被编译成共享库,并在运行时动态装入。
DSO方式的优势在于安装模块时无需重新编译apache。关于DSO机制的详细信息参见http://httpd.apache.org/docs-2.0/dso.html。
当前版本的mod_python仅支持DSO方式。
静态链接是一种较老的方式,比动态连接的方式支持更多的平台,但是较少使用。主要的缺陷是必须要重新编译apache,在很多情况下并不是一个好的选择。
2.2.1运行./configure
./configure脚本将会分析你的运行环境,并创建自定义的Make文件用于你的系统。使用autoconf生成的./configure包含如下内容:
$ ./configure --with-apxs=/usr/local/apache/bin/apxs
强烈建议使用这个选项。
$ ./configure --with-python=/usr/local/bin/python2.3
$ ./configure --with-max-locks=32
这个选项是在3.2.0版本开始提供的。
$ ./configure --with-flex=/usr/local/bin/flex
这是3.2.0版本中的新特性
$ ./configure --with-python-src=/usr/src/python2.3
这个是3.2.0版本中的新特性
2.2.2运行make
开始构建过程,简单的运行如下即可:
$ make
2.3安装
2.3.1运行make install
这个安装过程必须在root用户下完成:
$ su
# make install
这将会简单的将二进制版本复制到apache的libexec目录。
并且会安装python-libraries到site-packages并编译他们。
如果你想只安装python库或者只安装DSO,可以用如下make目标:
# make install_py_lib
# make install_dso
2.3.2配置apache
按照DSO模式安装的apache,需要在httpd.conf中加入启动mod_python的句子:
LoadModule python_module libexec/mod_python.so
实际的mod_python.so路径可能有所变化,但是make install将会显示这个文件的确切路径。
2.4测试
注意次部分内容仅适用于3.x版本,如果使用2.7.x版本,你需要找到更适合的文档。
<Directory /APACHEHOME/htdocs/test>
AddHandler mod_python .py
PythonHandler mptest
PythonDebug On
</Directory>
-
重定向所有以.py结尾的URL到mod_python处理器。mod_python收到请求之后查找合适的处理器来处理请求。这里有个简单的自定义处理器叫mptest。我们看看如何定义这个处理器。
-
此时如果修改了主配置文件httpd.conf则需要重启apache来使之生效。
-
编辑mptest.py文件在htdocs/test目录。
from mod_python import apache
def handler(req):
req.content_type='text/plain'
req.write("Hello, world!")
return apache.OK
-
指向URL路径到mptest.py。将会看到"Hello, world!"。如果看不到则参考故障处理。
-
依照配置文件的规则,指定任何.py文件都会最终指向mptest.py做处理。因为已经明确的指定了mptest做处理器。如果需要用不同的处理器处理不同的文件则需要更高层的处理器,比如publisher发布器、mpservlets或vampire。这些都是动态装入的处理器。
-
如果都运行无误则转入第三章,入门。
参考:
http://home.comcast.net/d.popowich/mpservlets
http://www.dscpl.com.au/projects/vampire
2.5故障处理
如果出现问题,可以按照如下的处理:
-
检查错误输出
-
检查服务器错误日志
-
单处理执行apache
$ ./httpd -X
这样将会显示更多有用信息
<Location /mpinfo>
SetHandler mod_python
PythonHandler mod_python.testhandler
</Location>
这时指向你的/mpinfo的URL则会显示一些信息帮助处理mod_python的问题。
mod_python版本
操作系统类型、名字、版本号
Python版本、非常规的编辑选项
apache服务器版本
相关的apache配置,.htaccess
相关的Python代码
完成...
第三章指南
3.1使用发布器(Publisher)的快速例子
这一节提供无需太多细节的发布器指南。更多如何使用mod_python处理器的细节将在以后解释。
发布器(publisher)提供了发布mod_python标准模块的方式。需要在配置文件中加入如下配置:
AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On
下例会返回简单的表单数据。询问姓名、电子邮件、注释之后将会给管理员发邮件。这个简单的应用程序由两个文件组成:form.html用于提交数据,form.py用于处理表单动作。
如下是表单:
<html>
Please provide feedback below:
<p>
<form action="form.py/email" method="POST">
Name: <input type="text" name="name"><br>
Email: <input type="text" name="email"><br>
Comment: <textarea name="comment" rows=4 cols=20></textarea><br>
<input type="submit">
</form>
</html>
注意表单的action属性指向form.py/email调用,如下创建form.py,如下:
import smtplib
WEBMASTER="webmaster" #管理员电邮
SMTP_SERVER="localhost" #本机SMTP服务器
def email(req,name,email,comment):
#一定要确保用户提供了所有的参数
if not(name and email and comment):
return "缺少必要的参数"
#创建消息文本
msg=""" \
From: %s
Subject: feedback
To: %s
I have the following comment:
%s
Thank You,
%s
""" % (email,WEBMASTER,comment,name)
#发送信息
conn=smtplib.SMTP(SMTP_SERVER)
conn.sendmail(email,[WEBMASTER],msg)
conn.quit()
#提供返回页面
s="""\
<html>
Dear %s,<br>
Thank you for your kind comments, we
will get back to you shortly.
</html>""" % name
return name
当用户点击提交按钮时,发布器将会装入email函数到form模块,传递表单字段作为关键字参数。也会传递请求对象到req。
注意逆必须要有req参数。发布器已经可以很聪明的传递必要的参数。函数的返回值将被发送到客户端浏览器。
即使使用发布器可以非常简单的处理,但是程序仍然可以利用mod_python的强大功能,比如调用请求对象。当然也可以调用本地的mod_python处理器来完成大量的工作。比如设置HTML头路由req.headers_out;返回错误抛出apache.SERVER_ERROR异常;从客户端的重定向读写文件req.write()和req.read(),等等。
阅读6.1节了解更多关于发布器的详细信息。
3.2apache处理器概览
节标题翻译有误,应为"快速学习apache如何处理请求"。
如果你想要深入钻研mod_python的功能,需要理解什么是处理器。
apache分阶段(phase)处理请求。比如第一个阶段是用户认证,之后是检验用户是否有权访问特定的文件,然后是读取文件并发送到客户端。一个典型的静态文件请求包含三个阶段:1.翻译URI到文件位置2.读取文件并发送到客户端3.记录请求日志。更复杂的处理依赖于配置文件。
一个处理器就是初始处理某个阶段的函数。同一个阶段可以有多于一个处理器进行处理,被叫做apache序列。对应每个阶段有个缺省的apache处理器(大多数只做缺省动作或者什么都不作)。然后由其他的apache模块提供处理器,比如mod_python。
mod_python提供了apache每一个重要的处理器。mod_python处理器缺省时不会做任何事情,除非用特定的配置文件标志。这些标志以"Python"开始并以"Handler"结尾(如:PythonAuthenHandler),指定Python函数来处理指定的阶段。所以mod_python的主函数只是作为发报机的角色连接apache处理器和Python函数。
最常用的处理器是PythonHandler。它处理含有上下文的请求。因为它没有名字,所以有时也成为通用处理器。这个处理器的apache缺省行为是读取文件并发送到客户端。大多数应用应该重写这个处理器。
3.3mod_python做了什么
我们假设有如下配置:
<Directory /mywebdir>
AddHandler mod_python .py
PythonHandler myscript
PythonDebug On
</Directory>
所以还需要一个如下文件,'/mywebdir/myscript.py'如下:
from mod_python import apache
def handler(req):
req.content_type="text/plain"
req.write("Hello World!")
return apache.OK
如下的事情将会发生:AddHandler标志告诉apache所有的以.py结尾的'/mywebdir'下或其子目录下的文件请求都由mod_python负责处理。'PythonHandler myscript'标志告诉mod_python通用处理器在myscript脚本。'PythonDebug On'标志告诉mod_python如果发生错误,则把错误信息输出到客户端,便于开发。
当请求到来时,apache开始分步骤处理请求并讲请求发送到mod_python。mod_python处理器检查配置获取处理器。在本例,我们除了通用处理器之外没有调用其他东西。当读取配置到'PythonHandler myscript'时,会发生下面的事情:
1.如果没有做过,假设预设目录已经存在于sys.path中。
2.尝试按名字导入模块myscript。注意子目录是不在sys.path中的,如果需要只能按照包名的方式调用。
3.在myscript中查找函数handler
4.调用这个函数并传递请求对象(关于请求对象的更多东西在后面)
5.在这里我们细致研究一下脚本:
from mod_python import apache
导入apache模块来获取apache的接口。大多数mod_python程序需要有这一行。
def handler(req):
这是处理器函数的声明。叫做'handler'是因为mod_python按照配置标志寻找函数。将配置标志转换成小写,然后去掉'python'即可。这样'PythonHandler'就成了'handler'。当然也可以用其他的名字,但是需要用'::'来分隔函数名,比如一个处理器函数叫'spam',那么配置标志就是'PythonHandler myscript::spam'
注意,处理器必须包含一个请求对象参数。请求对象提供了关于请求的大量信息,比如客户端的IP,请求头,URL等。向客户端发送信息也需要用到请求对象,这里是没有'response'对象的。
req.content_type="text/plain"
设置文档MIME类型为'text/plain'。缺省的是'text/html',但是如果处理器没有打算返回html,那么'text/plain'更恰当(appropriate)一些。特别注意:需要在req.write方法之前调用如上语句,因为一旦调用req.write,HTTP响应头就被发送出去了,其后的HTTP响应头的改变都会忽略。
req.write("Hello World!")
将会把字符串写入到客户端。
return apache.OK
告知apache,请求处理完成并成功。如果没有返回OK,则apache会自动返回为apache.HTTP_INTERNAL_SERVER_ERROR或return apache.HTTP_FORBIDDEN。当处理失败时会在错误日志中记录,并告知客户端一点错误信息。
小技巧:如果你注意到,会发现如果请求的URL不是指向myscript.py,而只是一个.py结尾的文件,哪怕是一个不存在的文件,也可以得到相同的结果。因为服务器只是将特定结尾的处理直接交给相关模块的,而并不要求那一定是一个存在的文件。
3.4更复杂的例子-认证
现在,你知道写一个处理器多么的简单,下面我们来显示一个更复杂的例子。
如果需要用密码来保护一个目录。比如登录名为'spam',密码为'eggs'。
首先需要告诉apache在需要认证时调用我们的认证处理器。加入PythonAuthenHandler标志到配置文件:
<Directory /mywebdir>
AddHandler mod_python .py
PythonHandler myscript
PythonAuthenHandler myscript
PythonDebug On
</Directory>
因为一个模块可以包含多个函数,所以也可以在一个模块中使用多个处理器。
然后是告知apache,使用Basic HTTP认证。仅限有效用户进入。配置如下:
<Directory /mywebdir>
AddHandler mod_python .py
PythonHandler myscript
PythonAuthenHandler myscript
PythonDebug On
AuthType Basic
AuthName "Restricted Area"
require valid-user
</Directory>
然后在myscript.py中写认证函数,一个简单认证函数如下:
from mod_python import apache
def authenhandler(req):
pw=req.get_basic_auth_pw()
#00
分享到:
相关推荐
《Mod_python 3.2.8 中文手册》是一份详细介绍如何使用 Mod_python 将 Python 语言集成到 Apache 服务器中的技术文档。该手册的主要目标是提升 Web 应用的性能,提供更好的可移植性和历史背景。 1. 性能优势: Mod...
《Mod_Python 3.2.8 中文手册》是针对初学者的一份详尽指南,它主要介绍了如何利用 Mod_Python 这一模块将 Python 语言高效地集成到 Apache Web 服务器中,从而提升 Web 应用程序的性能和可移植性。 1. **性能提升*...
《Mod_python 3.2.8中文手册》深入解析 Mod_python是一款强大的Apache服务器扩展,它使得Python能够更高效地处理Web请求,显著提升了性能。本手册将详细讲解Mod_python的功能、可移植性以及安装过程。 1. 性能优势...
`mod_python`手册是学习和理解如何配置、安装以及使用这个模块的重要资源。这份手册是官方英文版的CHM(Compiled Help Manual)文件,虽然没有中文版本,但对于熟悉英语的开发者来说,它是详尽且权威的参考文档。 ...
mod_python起源于Httpdapy项目(1997)。很久以后Httpdapy才被叫做mod_python,因为Httpdapy并不是特定用于apache服务器的。Httpdapy设计成跨平台的,而实际上主要从Netscape服务器开始(追溯到1997年的Nsapy)。 摘录...
2.3 List of modules in FreeCAD Mod folder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.4 Learning path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
FreeCAD中文教程-翻译版本 FreeCAD是一个免费的开源参数化3D建模应用程序,主要用于设计现实生活中的对象。参数化建模描述了某种类型的建模,您设计的3D对象的形状由参数控制。例如,砖的形状可能由三个参数控制:...
编辑Apache的配置文件(`httpd.conf`),添加必要的模块加载指令,比如`LoadModule python_module modules/mod_python.so`。创建一个虚拟主机,并在`DocumentRoot`中指定你的Django项目的路径。同时,配置mod_python的...
标题中的“modis_mctk1_MOD06_L2预处理_”暗示了这是一个关于MODIS(Moderate Resolution Imaging Spectroradiometer)卫星数据的预处理流程,具体针对的是MOD06_L2产品。MOD06_L2是MODIS的一个二级产品,主要提供...
### SVN for RedHat 安装手册 - IT知识详解 #### 一、安装前准备 **系统检查与确认**是SVN安装过程中的第一步,确保系统的兼容性和稳定性至关重要。以下为几个核心检查点: 1. **系统启动方式**:检查系统的默认...
- **PyMongo and mod_wsgi**:探讨了 Python 的 PyMongo 库与 Apache 的 mod_wsgi 扩展之间的集成方法。 - **MongoDB and Rails**:阐述了如何在 Ruby on Rails 应用中集成 MongoDB。 #### 八、版本控制与更新 - **...
- 提供了一些预备材料的链接,如官方wiki上的基础文档、FreeCAD的Python API文档以及快速入门的单文件PDF用户手册。 - 建议开发者事先阅读官方wiki和文档,以便更好地理解FreeCAD的API和工作流程。 7. 版权声明:...
这份"Python入门基础教程培训手册全套.ppt"提供了全面的Python基础知识,包括它的历史、特点、应用领域以及开发环境的配置,适合初学者进行系统学习。 1. **Python发展历程**:Python由Guido van Rossum在1989年...
4. 安装mod_python模块,它是Apache的Python模块,用于集成Python解释器和Apache Web服务器,需要注意的是,安装mod_python时需要停止Apache服务,并在安装完成后检查modules目录下是否有mod_python.so文件,以确保...
### dnscmd部署手册知识点详解 #### 一、部署环境 - **操作系统**: Windows Server 2008 R2 64位 - **Python版本**: 2.7.3 64位 - **Django版本**: 1.11.4 - **MySQL版本**: 5.7.18 64位 - **Apache版本**: 2.4 64...