Chinaunix首页 | 论坛 | 博客
  • 博客访问: 457383
  • 博文数量: 64
  • 博客积分: 3271
  • 博客等级: 中校
  • 技术积分: 727
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 18:42
文章分类

全部博文(64)

文章存档

2013年(1)

2011年(19)

2010年(42)

2009年(2)

分类: Python/Ruby

2011-01-03 21:17:18

  1. http://docs.cherrypy.org/dev/index.html

一.对象
     在cherrypy中,似乎所有东西都是对象。
 1. 官方的一个入门的例子:
     例一.
  1. import cherrypy

  2. class HelloWorld:
  3.     def index(self):
  4.         return "Hello world!"
  5.     index.exposed = True

  6. cherrypy.quickstart(HelloWorld())
       在上面的例子中,创建了一个HelloWorld类,类有一个方法index。在cherrypy中,方法名即是被访问的路径;即当访问时,会自动调用index()方法。方法的返回值即是输入到浏览器的内容。
       类似于web服务器的index.html,当访问web服务器时,会自动把index.html发送回来。当不指定访问哪个方法时,cherrypy就会自动将对的访问定位到index上。
       在类中,方法必须带有一个参数self。
       当方法会定义之后,必须要使用.exposed = True或者在方法前申明@cherrypy.expose来表示此能够被浏览器访问到。
       最后,把类的一个实例即对象传递给quickstart(),来启动服务器。

2.在对象中包含对象
 
例二.
  1. class OnePage(object):
  2.     def index(self):
  3.         return "one page!"
  4.     index.exposed = True
  5.  
  6. class HelloWorld(object):
  7.     onepage = OnePage()
  8.  
  9.     def index(self):
  10.         return "hello world"
  11.     index.exposed = True

  12. root = HelloWorld()
  13. cherrypy.quickstart(root)
这样就可以访问
  1. onepage
即访问的是root.onepage.index()方法.

二.函数

也可以直接定义函数,但是得让函数成为实例的成员。

  1. import cherrypy

  2. class HelloWorld:
  3.     def index(self):
  4.         return "Hello world!"
  5.     index.exposed = True

  6. root = HelloWorld()

  7. def foo():
  8.     return 'Foo!'
  9. foo.exposed = True

  10. root.foo = foo
  11. cherrypy.quickstart(root)
注意,在外部定义的函数和类里定义的方法不一样,后者带有一个表示类自身的参数self,而前者不带。

三.多层路径
     当有如 类似的url时cherrypy如何处理?
  1. import cherrypy

  2. class HelloWorld:
  3.     def index(self):
  4.         return "Hello world!"
  5.     index.exposed = True

  6. root = HelloWorld()

  7. def foo(year, month, day):
  8.     return '{}-{}-{}'.format(year, month, day)
  9. foo.exposed = True

  10. root.foo = foo
  11. cherrypy.quickstart(root)
当访问foo/2008/12/11时,会输出2008-12-11.
另一个例子:
  1. import cherrypy

  2. class HelloWorld:
  3.     def index(self):
  4.         return "Hello world!"
  5.     index.exposed = True

  6. root = HelloWorld()

  7. class Blog:
  8.     def default(self, year, month, day):
  9.         return '{}-{}-{}'.format(year, month, day)
  10.     default.exposed = True
  11.     def another(self, year, month, day):
  12.         return '{}-{}-{}'.format(year, month, day)
  13.     another.exposed = True
  14. root.blog = Blog()

  15. root.foo = foo
  16. cherrypy.quickstart(root)
当访问blog/2008/12/11 或者blog/another/2008/12/11 时会出现与上例一样的结果。注意此例中的default方法,和index()有类似的行为。当不给出具体要执行的方法时,若参数个数匹配,则就会执行default()方法。

注意:多层路径也可以使用二所说的方法,即:对象.对象...方法

四.表单的数据
对如下表单:
  1. <form action="doLogin" method="post">
  2.     <p>Username</p>
  3.     <input type="text" name="username" value=""
  4.         size="15" maxlength="40"/>
  5.     <p>Password</p>
  6.     <input type="password" name="password" value=""
  7.         size="10" maxlength="40"/>
  8.     <p><input type="submit" value="Login"/></p>
  9.     <p><input type="reset" value="Clear"/></p>
  10. </form>
要获取表单中的数据,则:
  1. import cherrypy

  2. class HelloWorld:
  3.     def index(self):
  4.         return "Hello world!"
  5.     index.exposed = True
  6.     @cherrypy.expose
  7.     def doLogin(self, username = None, password = None):
  8.         return '{}-{}'.format(username, password)
  9. cherrypy.quickstart(HelloWorld())
如果表单中有超过2个条目的数据,则会出错,这时可以修改下doLogin的参数,使它能够忽略多余的参数:
  1. def doLogin(self, username = None, password = None, **oth):
或者直接:
  1. def doLogin(self, **form):
  2.     return '{}{}'.format(form['username'], form['password'])
方法doLogin其实与方法default表现的行为一致,只是用的地方不一样。所以在default中不能使用字典参数。

阅读(6719) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~