web.py 进阶例程

web.py 的首页提供了一个 13 行的例子来演示如何开始一个应用,但其网站上似乎就没有别的更进一步的例子了。这两天简短学习了一下,写一个进阶例程。包括:读取 GET/POST 变量,以及模板的使用。

  1. #!/usr/bin/python
  2. import web
  3.  
  4. urls = (
  5.         '/sample', 'sample',
  6.         '/(.*)', 'hello'
  7.        )
  8.  
  9. class hello:
  10.     def GET(self, name):
  11.         i = web.input(times=1)
  12.         if not name: name = 'world'
  13.         for c in xrange(int(i.times)): print 'Hello,', name+'!'
  14.  
  15. class sample:
  16.     def _request(self):
  17.         render = web.template.render('templates/')
  18.         cache = False
  19.         i = web.input(fname = 'yingbo', sname = 'qiu')
  20.         #交换 fname, sname 的值
  21.         firstName = i.sname
  22.         surName = i.fname
  23.         print render.sample(firstName, surName)
  24.     def GET(self):
  25.         self._request()
  26.     def POST(self):
  27.         self._request()
  28.  
  29. if __name__ == "__main__":
  30.     import os
  31.     os.environ['PHP_FCGI_CHILDREN'] = "1" #FastCGI 运行模式
  32.     web.run(urls, globals())

模板:templates/sample.html

  1. $def with (firstName, surName)
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  4. "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  5. <html>
  6. <head>
  7. <meta">http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  8. <html>
  9. <head>
  10. <meta</a> http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  11. <title>dup2.net</title>
  12. </head>
  13. <body>
  14. <form action="sample" method="post">
  15. 名:<input type="text" name="fname" value="$firstName" /><br />
  16. 姓:<input type="text" name="sname" value="$surName" /><br />
  17. <p><input type="submit" value="提交" /></p>
  18. </form>
  19. </body>
  20. </html>

访问 http://www.dup2.net/papp/sample 就可以看到效果。这个 sample 可以接受 GET/POST 请求。参数为 fname 和 sname。执行结果就是将这两个值交换显示。

web.py 每个 URL 请求分发到一个类。这里就把 sample 分发给 sample 类,其它的所有 URL 分发给 hello 类。访问一下 http://www.dup2.net/papp/ladf/badf?times=3 看看 hello 的效果。

HTTP GET 和 POST 分别执行 class 里面的 method。使用 web.input() 来取得 request 参数和值。

然后用 web.template.render() 初始化模板目录。方法名 "sample" 对应的 "sample.html" 模板文件

计划下面研究模板系统...

Topic: 技术

评论

恩,python的确语法比perl规范多了,可惜俺当初先perl为主了

呵呵。perl适合懒惰的程序员用。

"class login:"应该是"class sample:"吧.

os.environ['PHP_FCGI_CHILDREN'] = "1" #FastCGI 运行模式

跟PHP有什么关系呢?不解.~

的确是我弄错了...改命名的时候漏了一处

另外的这个环境变量我是看代码知道的..

似乎起因是
a. PHP 启动 FastCGI 模式的时候需要这个参数
b. lighttpd 等 webserver 在启动 FastCGI 的时候通常会配置这个参数

c. web.py 框架判断读到这个环境变量的时候就进入 FastCGI 模式运行.

估计也可以在 apache 配置文件里面配 code.py 进入 fastcgi 模式,或者执行 code.py 之前配置运行的环境变量,而不是这样在程序里面主动写环境变量.