应用实例
hello.py
import cherrypy
class Root(object):
@cherrypy.expose
def index(self):
return "Hello World!"
if __name__ == '__name__':
cherrypy.quickstart(Root(), '/')
正如cherrypy.quickstart(Root(),'/')
是在“/”枯井上启动内置的HTTP服务器服务。
正如@cherrypy.expose()
是将该方法暴露,使得其能被Cherry调用。
CherryPy是一个专注于单一任务的小框架;接受HTTP请求,并找到与请求URL匹配的Python函数或者方法。
Cherry不提供对数据库访问,HTML模板或任何其他中间件功能的内置支持。
CherryPy框架
支撑运行Hello World的CherryPy的框架大致如下图所示,图中的节点名称是CherryPy中的类名。
CherryPy框架.png
当一个请求发生时,首先到达的是CPWSGIServer,CPWSGIServer基于socket,win32下对应的底层支持module是process/win32.py。由于CherryPy支持WSGI接口的应用,故CPWSGIServer也能支撑WSGI应用。
CPWSGIServer会将每个请求封装成一个HTTPConnection,然后扔到队列Queue里面,由ThreadPool中的WorkerThread来处理,处理方式很简单,就是ThreadPool启动多个WorkerThread,每个WorkerThread去Queue中取HTTPConnection,然后处理之。CherryPy中,可以设置WorkerThread的个数。
ThreadPool模块和_cp开头的module的交互是通过_cpserver.Server,它只是一个Adapter,包装了底层的Server类。HTTPConnection会将消息转发到_cptree.Tree,该类中记载了站点的相对路径(比如“/”)和对应的Application之间的对应关系,那么它会跟据不同的URL请求转到对应的Application中。
Application中则封装了用户定义的类HelloWorld对象,故在需要返回数据给客户端时,调用到HelloWorld中。
单一应用
最直接的方法是使用cherrypy.quickstart()功能。他需要至少一个参数,即应用程序的实例。另外还有两个可选参数。
第一个是应用程序可以访问的基本路径。第二个是一个配置字典或文件用来配置所托管的应用程序。
cherrpy.quickstart(Blog())
cherrpy.quickstart(Blog(), '/blog')
cherrpy.quickstart(Blog(), '/blog', {'/': {'tools.gzip.on': True}})
第一个例子意味着你的应用程序将在http://hostname:port/ 下可用, 而另外两个将使你的应用程序可在http://hostname:port/blog 上使用。
第三种情况下,设置相对于应用程序,而不是在哪里可用, 所以是{'/': ...} 而不是{'/blog': ...}
cherrypy.quickstart()方法对于单个应用程序是好用的,但是缺乏使用服务器托管多个应用程序的能力。
多应用程序
要实现托管多应用程序的能力,需要使用cherrypy.tree.mount 功能:
cherrypy.tree.mount(Blog(), '/blog', blog_conf)
cherrypy.tree.mount(Forum(), '/forum', forum_conf)
cherrypy.engine.start()
cherrypy.engine.block()
本质上, cherrypy.tree.mount 使用和cherrypy.quickstart 相同的参数: 应用程序实例, 托管路径, 配置字典。 最后两行只是启动服务器。
除此之外Cherrypy还可以托管外部WSGI应用程序。
网友评论