首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

19.3  理解mod_python基础

让我们来看看前面的例子到底是如何工作的。第一个重要的部分是您加入Apache配置文件中的目录部分。第一行,AddHandler mod_python .prog,告诉Apache PythonHandler会用来处理该目录下所有以“.prog”结尾的文件请求。也就是说,您也可以通过请求http://localhost/py/fake.prog来得到同样的文档。实际上,这是一个强大的功能,它可以不必使用Apache本身普通的选择文件逻辑,稍后会详细介绍。

PythonHandler test行可以在Apache初始化的时候,高效地运行import test。无论什么时候一个相关的请求到来,test.handler()函数都会被调用,同时一个Apache请求对象会被传入。

PythonDebug会跟踪发送到Apache的错误日志和客户端。通常来说,这些异常只是发送到Apache的错误日志中,但是您会发现,当您调试程序的时候,如果能在浏览器中看到实时的异常是会非常有帮助。

现在让我们来看看test.py并检查一下Python端发生了什么。每个服务器进程都会载入test.py。Apache初始化时,它经常建立几个服务器进程,而每个进程都会载入和初始化一个全新的test.py。然而,对于每个服务器进程,这通常来说只做一次。还可以在Apache执行中建立服务器进程。这是非常有可能的,例如:当服务器的负载增加的时候,就需要建立新的服务器进程。在服务器进程开始的时候,Python的脚本并不立刻载入,而是会在第一个请求到来的时候被载入。每当有对于Python程序的请求到来时,Apache就调用handler()。这个函数会接收请求并处理它。handler()函数的返回值表示返回给客户端的是什么类型的应答。

handler()函数做的第一件事是检查请求是否只针对一个头文件(header)。如果是,那就是需要提交的全部。否则,它会产生全部的body文件。很多mod_python程序和CGI脚本并不做这种检查,会直接提交全部的body。这通常是可以的,但是可能的话,最好能做这个检查以满足客户的需要。

handler()函数用来产生发送给客户端的文档。注意,您可以使用req.write()来把数据传递给客户端。最后,返回一个“OK”状态码。

19.3.1  PythonHandler的角色

在前面讨论PythonHandler的时候,我介绍了handler用来处理该目录下所有以.prog为后缀的文件请求。这非常重要,且在刚接触时会感到有违常理。因为对于工作在Web服务器上的其他方法,包括静态HTML和CGI脚本,您期望Web服务器会根据URL的请求来选择一个不同的文档,您还会期望当文档不存在的时候,能够返回一个错误值。

PythonHandler就不是这样。通过mod_python,所有匹配AddHandler指示的请求都被传递给Python处理程序(handler)。接着Python处理程序被用来决定如何处理这些请求——通过请求来选择不同的文档,返回错误或像前一个例子那样根本就忽略了文件名。

这样就有了一个功能非常强大的工具。例如,您可以把一个软件下载站点展现成完全虚拟的层次。或者您可以编写自己的逻辑来检查一个给出的请求是否有效。再或许您会使用文件名在Python dictionary中查找函数,或者是直接引入您自己的模块。

下面是一些不同的URL。根据前面给出的例子程序和配置文件,看看对于每个URL您能否给出Apache的返回结果:

http://localhost/py/test.prog

http://localhost/py/nonexistent.prog

http://localhost/py/somedir/test.prog

http://localhost/py/somedir/nonexistent.prog

http://localhost/py/nonexistent.html

前两个例子都返回和前面例子一样的页面,那就是“mod_python is working”。第二个例子也能显示的原因是,它也是由test.py这个Python处理程序来处理的。您会看到在输出中,URI是不同的。这是您稍后用来区分不同请求的关键。

后3个例子会显示“404,文件没找到”错误。对于"somedir"的例子,因为在这里,处理程序只被设置成针对一个特殊的目录,包括虚拟目录,而"somedir"这个目录是不存在的。Apache会产生一个错误。最后一个例子之所以错误,是因为并没有为.html文件指定Python处理程序。处理权就被返回给Apache默认的处理程序,该默认程序会读文件并发送给客户端。这里因为文件不存在,所以客户端会收到错误信息。

mod_python和其他类型的Web程序之间的这个区别是mod_python最容易引起混淆的地方。请切记,对于匹配AddHandler的所有请求,都调用PythonHandler。

这样的结果就是用户看到的URL不需要以.prog或.py结尾。它们事实上可以有任何的扩展名——.cgi或干脆是.html(尽管您在这样使用前,需要确保您真能提供HTML);否则,有些浏览器会无法辨识。

19.3.2  处理程序返回值

处理程序的返回值包含着Apache传递给客户端的是什么类型的HTTP状态码。这些状态码是“200,Success”或“404,文件没找到”。完整的返回值常量由Apache定义,并在mod_python文档中列出了。大部分都是很少用到的,或者是曾经用到的。下面是其中最常用的几个:

l  apache.HTTP_OK (200)表示请求是有效的,文档或头文件会被发送。

l apache.HTTP_MOVED_PERMANENTLY (301)和apache.HTTP_MOVED_TEMPORARILY (302)表示HTTP转向了。

l apache.HTTP_UNAUTHORIZED (401)表示需要进行HTTP认证,或者认证失败。

l apache.HTTP_FORBIDDEN (403)通常是和HTTP认证没有关系的“没有权限”错误。

l apache.HTTP_NOT_FOUND (404)通常是“没有找到”信息,它通常用来回答无效的请求。

在本章前面的例子中,程序总是返回apache.HTTP_OK以表示一个成功的请求。大多数mod_python脚本也会在有些时候返回apache.HTTP_NOT_FOUND。

mod_python还可以产生异常,异常可以把特殊的结果代码传递给客户端。例如,您正在检查提供的URL,确定执行哪个函数。如果您找不到,您就可以调用raise apache.SERVER_RETURN或apache.HTTP_NOT_FOUND。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论