Cherrypy 是嘛东西?

CherryPy 是个典型的面向对象的 HTTP 开发框架.

CherryPy 可以让开发者可以象开发类似其他Python面向对象的程序那样简单并快速地去开发一个Web应用. 下面就是一个简单的例子:

import cherrypy
class HelloWorld:
    def index(self):
        return "Hello World!"
    index.exposed = True
cherrypy.quickstart(HelloWorld())

要运行这段代码, 只需要在命令行进入该代码文件夹, 运行下面的命令:

python hello.py

然后 使用浏览器访问地址: http://localhost:8080

浏览器上就显示出结果:

Hello World!

这时, 在命令行窗口上按下 Ctrl+C 键便可以终止程序的运行.

代码 import cherrypy 将引入 CherryPy 模块扩展.

HelloWorld 类的定义则会将完成类的方法的发布.

有一个必须定义的 index() 方法则默认为URL(如: http://localhost:8080)中的网站root, 该方法返回的字符串将做为网页中的 内容 (如本例中的 ‘Hello World!’).

代码 index.exposed = True 则表明 index() 方法是要开放出去的.

  • 只有开放出去的方法,才可以处理各种HTTP请求.
  • 让开发人员自主控制对象的方法是否开放为Web请求更简单快捷.
  • 在方法前使用代码 @cherrypy.expose 同样也能立即发布该方法:
@cherrypy.expose
def index(self):
    return "Hello World!"

代码 cherrypy.quickstart(HelloWorld()) 是将对象做为 CherryPy 的HTTP Handle 启动 CherryPy 的 Web 服务.

发布 HelloWorld 类的实例

  • 启动内嵌 webserver
  • 直到按(Ctrol+C)键结束运行

当应用运行时, CherryPy 是以默认配置运行的.

  • 监听地址 localhost 监听端口 8080
  • 这些默认值都可以使用配置文件进行覆盖修改
    • cherrypy.config.update({‘server.socket_port’:8010})
    • 这样就将监听端口修改为8010了.

服务器的访问地址为: http://localhost:8080

  • HelloWorld 类中找最匹配的方法来处理Web请求.
  • 调用 HelloWorld().index() 方法.
  • 方法返回给请求用户的浏览器内显示.

Cherrypy 应用实例

CherryPy 可以让你开发出内嵌Python标准应用多线程Web服务的强大的Web应用. 你可以在任何可以运行Python程序的环境下布曙它. 并不需要Apache, 但你可以在Apache(或者 lightpd 甚至 IIS)中调用 CherryPy 应用. 可以运行于 Windows, Linux, Max OS X 以及其他的支持 Python 语言的操作系统.

除此之外, CherryPy 还会原汁原味地保留你的应用. 你可以自由地使用各种各样的模板,数据存取等技术方案. CherryPy 也能处理诸如 Session, 静态文件, Cookie, 文件上传等几乎所有 Web 应用中涉及到的东西.

功能

  • 高效的, 兼容HTTP/1.1, 支持 WSGI 线程池的webserver. 通常 CherryPy 处理页面本身耗时仅 1-2ms!
  • 支持其他任何支持 WSGI 的webserver, 诸如 Apache, IIS, lighttpd, mod_python, FastCGI, SCGI, 和 mod_wsgi 等等.
  • 多HTTP实例服务.
  • 强大的开发与布曙配置系统.
  • 灵活的扩展性能.
  • 内建 缓存, 编码, SESSION, 身份认证, 静态化 等支持.
  • 内置支持 mod_python .
  • 完整的测试套件.
  • 任意交互与定制.
  • Built-in profiling, coverage, and testing support.
看看下面的例子 (root 是指向网站根目录的一个参考),

root = HelloWorld()

root.onepage = OnePage()

root.otherpage = OtherPage()

URL http://localhost:8080/onepage 指向了 OnePage() 的对象实例,

URL http://localhost:8080/otherpage 指向了 OtherPage() 的对象实例.

又如,

root.some = Page()

root.some.page = Page()

URL http://localhost:8080/some/page 请求映射转给了 root.some.page 对象开放出来的方法(诸如 index 方法).

在本例中, 为本例添加 http://.../onepage 访问到 OnePage() 可以象下面这样搞定:

class OnePage():
    def index(self):
        return "one page!"
    index.exposed = True
class HelloWorld(object):
    onepage = OnePage()
    def index(self):
        return "hello world"
    index.exposed = True
cherrypy.quickstart(HelloWorld())

打开浏览器地址栏输入 http://localhost:8080/onepage

Index 方法

  • index() 方法就如同 index.html 文件一样, 是系统默认访问文档.
  • 附带参数与页面表单的GET POST参数对应.
  • 仅在URL与方法路径完全一致的情况下才被调用.

其他方法

对象所发布出去的方法均被CherryPy映射为可访问的 URL.

class HelloWorld():
    def index(self):
        return "Hello World!"
    index.exposed = True

    @cherrypy.expose
    def test(self):
        return "Test Controller"
cherrypy.quickstart(HelloWorld())

按上面的代码,只需要请求 http://localhost:8080/test 就可以访问 HelloWorld 对象的 test 方法了.

当 CherryPy 处理URL为 /test 的请求时, 会自动调用 test() 来处理.

  • 可以是平常的 function, 也可以是任何可以调用的任意对象的方法.

CherryPy 会去查找所有满足条件的对象的可调用方法,并调用最后一个匹配的方法.

  • 方法,函数甚至那些支持 __call__ 属性的对象,以及那些连 index() 方法都没有的对象都可以做 CherryPy 的事件处理.

然后对象会被调用.

在生产环境中, Python 的类能调用是很必须的.

而且 CherryPy 的表单还支持 POST 及 GET 方法处理.