Size: 6861
Comment:
|
Size: 9
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
##language:zh ''' 含有章节索引的中文 文章模板 ''' -- oatil [[[DateTime(2004-08-09T23:22:00Z)]]] [[TableOfContents]] = mod_python中文文档 = ''简述'' == 第三章 指南 == 通过前一节我们安装完毕mod_python,现在可以通过快速阅读本章进入程序开发阶段。本章不是一个安装手册。 我们也强烈推荐你在阅读完本章以后阅读(至少是前面的部分)第4节Python API的内容。 3.1快速开始学习发布处理器(Publisher Handler) 这一节提供了一个全面快速的关于发布处理器的概况,从而使我们可以不用关注太多的细节开始学习。在这个指南的最后一节,会有一个更详细全面的关于mod_python处理器如何工作的解释。 发布处理器是mod_python的一个标准处理器。为了使你的发布处理器正常工作,你需要在你的配置文件(httpd.conf)中加入下面几句话: {{{<Directory D:/apache/Apache2/cgi-bin/oa> AddHandler mod_python .py PythonHandler mod_python.publisher PythonDebug On </Directory> }}} 接下来的这个例子展示了一个简单的回馈表单,这个表单询问用户的名称,电子邮箱,地址和意见,然后发送一封电子邮件给网络管理员,信的内容就是用户填写的意见。这个简单的程序包括两个文件:form.html---用来收集数据,form.py---表单的action指令发送的目标。 下面是form.html的代码: {{{ <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> }}} 注意<form>标签的action指令指向了form.py/email。接下来我们编写这个名叫form.py的脚本,如下: {{{ import smtplib WEBMASTER = "webmaster" # webmaster e-mail SMTP_SERVER = "localhost" # your SMTP server def email(req, name, email, comment): # make sure the user provided all the parameters if not (name and email and comment): return "A required parameter is missing, \ please go back and correct the error" # create the message text msg = """\ From: %s Subject: feedback To: %s I have the following comment: %s Thank You, %s """ % (email, WEBMASTER, comment, name) # send it out conn = smtplib.SMTP(SMTP_SERVER) conn.sendmail(email, [WEBMASTER], msg) conn.quit() # provide feedback to the user s = """\ <html> Dear %s,<br> Thank You for your kind comments, we will get back to you shortly. </html>""" % name return s }}} 当用户点击确定按钮的时候,发布处理器就会调用form模块中email方法,把表单中的域值做为email的参数传递给email方法,并且也会把request的对象req一并传递过去。 注意你并不是非要把req做为email方法的一个参数不可,如果你并不需要它,你可以省略掉。 发布处理器很灵活,它只会把那些在方法的参数中有的域值传递过去。 方法的返回值通过浏览器显示出来。 虽然发布处理器极大的简化了mod_python编程,但是mod_python所有的强大功能却没有损失,因为发布处理器可以访问到request对象,所以你可以做与原生(native)mod_python处理器完全相同的事情。 举例来说: 通过req.headers可以自定义头(header),通过抛出apache.SERVERERROR返回异常,通过req.write()和req.read()直接读写客户端等等。 阅读6.1节获得更多关于发布处理器的信息。 3.2 快速学习怎样请求apache处理器。 如果你想更深入的研究mod_python的功能,你需要弄明白一个处理器是怎样一步步处理请求的。 例如,第一步可能是确定用户,接下来验证用户是不是允许访问特定的文件,然后读这个文件并把它发到客户端。 一个典型的静态文件请求需要三步:(1)解析请求URI为文件的路径。(2)读文件并把它发送到客户端,然后(3)记录请求日志。 Exactly which phases are processed and how varies greatly and depends on the configuration. 一个处理器就是处理其中某一步的方法,有可能在处理某一步的时候有不止一个处理器,在这种情况下,他们被apache依次调用。每一步都有一个默认的apache处理器(大多数情况下都是很基础的方法或者不做任何事情)。与此同时,apache模块提供了附加的处理器,比如mod_python,mod_python为apache提供了每一个可能的处理器,mod_python的处理器默认的不会提供任何方法,除非我们明确的在配置文件中指定。 这些指定以”python”开始,以”Handler”结束(比如:PythonAuthenHandler)并且对应于一个python方法。所以mod_python的方法扮演的是发报机的角色,通过它联系apache处理器和开发人员比如你写的python方法。 最经常用到的处理器是PythonHandler,它处理那些有关于请求在提供真实内容的时候的步骤。 因为它没有名字,所有有时候它被作为了泛义上的处理器。这个处理器的默认的apache动作是读文件并把它发送的客户端。你写的大多数程序都会重载这个处理器。 如果想了解所有的处理器,请查看第5节 3.3 那么mod_python到底做了些什么呢? 假设我们有下面的配置文件: {{{ <Directory /mywebdir> AddHandler mod_python .py PythonHandler myscript PythonDebug On </Directory> }}} 注意: /mywebdir 是一个物理绝对路径。 还有一个python程序‘/mywedir/myscript.py’如下: {{{ from mod_python import apache def handler(req): req.content_type = "text/plain" req.write("Hello World!") return apache.OK }}} 这里是说明:AddHandler指示告诉apache所有在/mywebdir目录或者子目录下的关于.py文件的请求都需要被mod_python执行,PythonHandler myscript’指示告诉mod_python用myscript执行处理器。 ‘PythonDebug On’ 指示告诉mod_python如果python发生错误,就把错误信息打印到客户端 (相对于写入日志文件),在开发的时候这个选项非常有用。 当一个请求发出时,apache开始分步通过它的请求处理步骤调用mod_python中的处理器。Mod_python的处理器检查请求的那个处理器是否在配置文件中指定了(记住,它的角色是发报机),在我们的例子中,mod_python不会为所有的处理器所任何动作。 3.2. 快速学习一个apache如何处理请求 (未完待续) |
rubbish |
rubbish