cherrypy学习记录

最近在项目学习中,需要用到cherrypy web框架,现将学习过程记录如下。
CherryPy是一种用于 Python 的、简单而又非常有用的 Web 框架。它所做的全部工作就是以尽可能少的代码将 Web 服务器与 Python 代码连接。它并不决定使用哪些其他工具,所以可以从自己的角度自由地选择模板系统、数据库映射程序或者其他工具。
1、cherrypy请求
CherryPy 不是依靠 Apache 或者另外的 Web 服务器,而是运行它自己的小型的基于 Python 的 Web 服务器。传统的 Web 服务器在目录树磁盘之外创建一个 Web 空间,而 CherryPy 服务器则在 Python 对象树之外创建它的 Web 空间。
对于 URL http://localhost:8080/hello/ 的请求。在传统的 Web 服务器中,这种 URL 相应于 Web 空间根部下面的 hello/ 目录。当您使用 Web 浏览器访问它时,Web 服务器读取 hello/ 目录中的 index.html 文件或者调用该目录中的 index.cgi 脚本作为一个 CGI,并且向您发送输出。然而,CherryPy Web 服务器不提供根植于磁盘目录中的 Web 空间,而提供根植于特定的 Python 对象 cpg.root 中的 Web 空间。若要访问那个对象的每个方法和成员,只需将它的名称附加到根 URL 上即可。所以,hello/ URL 在 CherryPy 中相应于 cpg.root 的成员 hello。
2、通过定义一个方法为请求提供服务
如果 cpg.root.hello 是一个方法,则 CherryPy 调用该方法,方法的输出被发送到 Web 浏览器。下面的代码定义一个暴露 hello 方法的对象:

from cherrypy import cpg
class Application(object):
	@cpg.expose
	def hello(self):
		return "hello,world"

通过 Python 运行这段脚本,CherryPy Web 服务器将会启动。只要该脚本一直在运行,您就可以访问 http://localhost:8080/hello/,并且可以看到字符串 Hello, world!。(当然,这还得假定您没有在端口 8080 上运行一台服务器。)如果您访问其他 URL,包括 Web 服务器根,将会得到一个 CherryPy 错误,因为 /hello/ 是该应用程序知道如何提供服务的惟一 URL。
3、通过定义对象树为请求提供服务
如果 cpg.root.hello 是一个对象,而不是方法,那么当用户访问 /hello/ 时,CherryPy 会调用 hello 对象的 index() 方法。这些代码以与先前示例相同的方式提供 /hello/ URL 服务:

from cherrypy import cpg
class HelloWorld(object):
	@cpg.expose
	def index(self):
		return "Hello world!"
class Application(object):
	hello = HelloWorld()

cpg.root = Application()
cpg.server.start()

当您访问 /hello/ URL 时,您的请求被映射到对象 cpg.root.hello,并且其默认的方法(index())被调用来处理该请求。
4、暴露对象和方法
方法 hello 和 index 上的 装饰符 @cpg.expose 有什么用呢?它告诉 CherryPy,调用该方法来响应 Web 请求没有问题。
在提供静态文件的 Web 网站,假定 Web 空间中的每个文件和目录都计划用于公共消耗。但是也有几处例外,例如,Apache 就不会提供隐藏的文件,如 UNIX® 系统上的 .htaccess。
当您将一个对象树暴露为一个 CherryPy URL 空间时,假设是另一种情形:除非您显性地将方法标记为暴露,否则它不会为外面的用户提供服务。考虑一下许多编程语言中公有和私有类成员之间的区别,(并且通过 Python 中的 _method() 约定非正式地实施)。一个设计良好的 CherryPy 类可能只有少数几个公有的方法暴露给 Web 客户机,但是它很可能有许多不允许客户机直接访问的内部方法。
我认为装饰符是将方法暴露给 CherryPy 的最佳方式,但是也可以通过将其成员 exposed 设置为 True 来暴露一个方法:

class HelloWorld(object):
	def index(self):
		return "Hello world"
	index.eposed = True

装饰符不存在于版本 2.4 之前的 Python 中,因而 exposed 这个技巧可能是您将方法暴露给 CherryPy 的惟一方式。
5、收集用户输入
当用户向 CGI 脚本提交表单或者提供信息时,Web 浏览器会收集那些信息,并且通过环境变量将其传递给该脚本。脚本的责任是解析和理解这些信息,尽管有一套约定控制着这些信息的格式和用途。CherryPy 使用这些非正式的约定消除这个过程的几个步骤,以参数的形式将用户输入提供给它决定调用的 Python 方法。
6、将查询字符串转变为关键字参数
考虑一个具有查询参数的 URL,比如 http://localhost:8080/hello/?what=hello&who=world。用户可能已经点击这个 URL,或者已将它提交为填充 HTML 表单的结果。传统的基于 CGI 的 Web 服务器将把 what=hello&who=world 传递到环境变量 QUERY_STRING 中的 CGI 脚本。CGI 脚本负责取出该变量,解析那个字符串。Python 的 cgi 模块为您进行解析。但是,使用 CherryPy,您不必做任何事情。CherryPy Web 服务器自动将 URL 的查询字符串转变为一组关键字参数。

class Application(object):
	@cpg.expose
	def hello(self,what = 'hello',who = 'world'):
		return '%s,%s!' %(what,who)

当用户点击 /hello/ URL 时,CherryPy 将查询字符串中的 what 和 who 转换为 hello() 方法的参数。从 URL 到 Python 方法调用的转换对您来说完全是透明的。它甚至不在乎原始的 HTTP 请求是通过方法 GET 进来的,还是通过方法 POST 进来的。
未完。。。待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值