python网络编程学习笔记(10):webpy框架
django和webpy都是python的web开发框架。Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(DoNotRepeatYourself)原则。webpy小巧,简单,实用,可以快速的完成简单的web页面。这里根据webpyCookbook简要的介绍一下webpy框架,更加详细请见http://webpy.org/cookbook/index.zh-cn。
一、安装与开发
web.py下载地址:http://webpy.org/static/web.py-0.33.tar.gz。解压并拷贝web文件夹到你的应用程序目录下。或者,为了让所有的应用程序都可以使用,运行:
pythonsetup.pyinstall
注意:在某些类unix系统上你可能需要切换到root用户或者运行:
sudopythonsetup.pyinstall
也可以直接把里面的WEB文件夹放site-packages。
web.py内置了web服务器,代码写完后,将其保存,例如文件名为mywebpy.py,可以用下面的方法来启动服务器:
pythonmywebpy.py
打开你的浏览器输入http://localhost:8080/查看页面。若要制定另外的端口,使用pythonmywebpy.py1234。
二、URL处理
任何网站最重要的部分就是它的URL结构。你的URL并不仅仅只是访问者所能看到并且能发给朋友的。它还规定了你网站运行的心智模型。在一些类似del.icio.us的流行网站,URL甚至是UI的一部分。web.py使这类强大的URL成为可能。
urls=( '/','index' )
第一部分是匹配URL的正则表达式,像/、/help/faq、/item/(\d+)等(\d+将匹配数字)。圆括号表示捕捉对应的数据以便后面使用。第二部分是接受请求的类名称,像index、view、welcomes.hello(welcomes模块的hello类),或者get_\1。\1会被正则表达式捕捉到的内容替换,剩下来捕捉的的内容将被传递到你的函数中去。这行表示我们要URL/(首页)被一个叫index的类处理。现在我们需要创建一个列举这些url的application。
app=web.application(urls,globals())
这会告诉web.py去创建一个基于我们刚提交的URL列表的application。这个application会在这个文件的全局命名空间中查找对应类。
一般来说,在每个应用的最顶部,你通常会看到整个URL调度模式被定义在元组中:
urls=( "/tasks/?","signin", "/tasks/list","listing", "/tasks/post","post", "/tasks/chgpass","chgpass", "/tasks/act","actions", "/tasks/logout","logout", "/tasks/signup","signup" )
这些元组的格式是:URL路径,处理类。
你可以利用强大的正则表达式去设计更灵活的URL路径。比如/(test1|test2)可以捕捉/test1或/test2。要理解这里的关键,匹配是依据URL路径的。比如下面的URL:
http://localhost/myapp/greetings/hello?name=Joe
这个URL的路径是/myapp/greetings/hello。web.py会在内部给URL路径加上和$,这样/tasks/不会匹配/tasks/addnew。URL匹配依赖于“路径”,所以不能这样使用,如:/tasks/delete?name=(.+),?之后部分表示是“查询”,并不会被匹配。阅读URL组件的更多细节,请访问web.ctx。
你可以捕捉URL的参数,然后用在处理类中:
/users/list/(.+),"list_users"
在list/后面的这块会被捕捉,然后作为参数被用在GET或POST:
classlist_users: defGET(self,name): return"Listinginfoaboutuser:{0}".format(name)
你可以根据需要定义更多参数。同时要注意URL查询的参数(?后面的内容)也可以用web.input()取得。
三、helloworld
现在我们需要来写index类。虽然大多数人只会看看,并不会注意你的浏览器在使用用于与万维网通信的HTTP语言。具体的细节并不重要,但是要理解web访问者请求web服务器去根据URL(像/、/foo?f=1)执行一个合适的函数(像GET、POST)的基本思想。GET用于请求网页文本。当你在浏览器输入harvard.edu,它会直接访问Harvard的web服务器,去GET/。POST经常被用在提交form,比如请求买什么东西。每当提交一个去做什么事情(像使用信用卡处理一笔交易)的请求时,你可以使用POST。这是关键,因为GET的URL可以被搜索引擎索引,并通过搜索引擎访问。虽然大部分页面你希望被索引,但是少数类似订单处理的页面你是不希望被索引的。
在我们web.py的代码中,我们将这两个方法明确区分:
classindex: defGET(self): return"Hello,world!"
当有人用GET请求/时,这个GET函数随时会被web.py调用。
好了,限制我们只需要最后一句就写完了。这行会告诉web.py开始提供web页面:
if__name__=="__main__":app.run()
这会告诉web.py为我们启动上面我们写的应用。
于是将上面的代码完整列出如下:
importweb urls=( '/','index' )
classindex: defGET(self): return"Hello,world!"
if__name__=="__main__": app=web.application(urls,globals()) app.run()