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 方法处理.