前两天写的git钩子,一直觉得还需要两个语言来配合实现,而且还要一个中间文件十分不方便,于是想着能否完全使用python,找来找去,找到了一个非常简便的python web框架,web.py,使用起来非常简单方便。因为一般的web服务器,如nginx,apache,利用服务端脚本的fast_cgi进程做web服务,一般都无法使用root身份,但是如果使用脚本直接作为web服务,就像python,node这样的,就十分方便了。
python有一种命令方式:python -m SimpleHTTPServer 8080,这样可以非常方便的建立一个web服务,可以用于简单的html浏览和下载等等,但是功能非常有限,web.py是封装的web框架,其实原理我感觉也是重写的这个simplehttpserver,有时间应该看下源码
一下为引用:
转自:http://www.oschina.net/question/5189_4306
web.py 是一个Python 的web 框架,它简单而且功能强大。web.py 是公开的,无论用于什么用途都是没有限制的。
先让大家感受一下web.py 的简单而强大:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import web urls = ( '/(.*)', 'hello' ) class hello: def GET(self, name): i = web.input(times=1) if not name: name = 'world' for c in xrange(int(i.times)): print 'Hello,', name+'!' if __name__ == "__main__": web.run(urls, globals()) |
看看,上面就是一个基于web.py 的完整的Web 应用。不信?!将上面的代码保存为文件code.py,在命令行下执行python code.py。然后打开你的浏览器,打开地址:http://localhost:8080/RossWan,看看结 果 :)没有意外的话(当然要先安装web.py,下面会有介绍),浏览器会显示“Hello, RossWan!”。这是一个最简单的Hello world Web 应用。是不是很简单?!下面将较为详细地介绍下web.py 。Find fun
1. 安装
单击这里下载web.py 的安装文件,将下载得到的文件web.py-0.21.tar.gz 解压,进入解压后的文件夹,在命令行下执行:python setup.py install,在Linux 等系统下,需要root 的权限,可以执行:sudo python setup.py install。
安装完毕之后,就可以正式开始web.py 之旅…
2. URL 处理
对于一个站点来说,URL 的组织是最重要的一个部分,因为这是用户看得到的部分,而且直接影响到站点是如何工作的,在著名的站点如:del.icio.us ,其URLs 甚至是网页界面的一部分。而web.py 以简单的方式就能够构造出一个强大的URLs。
在每个web.py 应用,必须先import web 模块:
1 |
import web |
现在,我们须要告诉web.py URL 如何组织,让我们以一个简单例子开始:
1 2 |
urls = ( '/', 'index' ) |
web.py 是一个Python 的web 框架,它简单而且功能强大。web.py 是公开的,无论用于什么用途都是没有限制的。
先让大家感受一下web.py 的简单而强大:
12345678910111213 import weburls = ('/(.*)', 'hello')class hello:def GET(self, name):i = web.input(times=1)if not name: name = 'world'for c in xrange(int(i.times)): print 'Hello,', name+'!'if __name__ == "__main__": web.run(urls, globals())
看看,上面就是一个基于web.py 的完整的Web 应用。不信?!将上面的代码保存为文件code.py,在命令行下执行python code.py。然后打开你的浏览器,打开地址:http://localhost:8080/RossWan,看看结 果 :)没有意外的话(当然要先安装web.py,下面会有介绍),浏览器会显示“Hello, RossWan!”。这是一个最简单的Hello world Web 应用。是不是很简单?!下面将较为详细地介绍下web.py 。Find fun
1. 安装
单击这里下载web.py 的安装文件,将下载得到的文件web.py-0.21.tar.gz 解压,进入解压后的文件夹,在命令行下执行:python setup.py install,在Linux 等系统下,需要root 的权限,可以执行:sudo python setup.py install。
安装完毕之后,就可以正式开始web.py 之旅…
2. URL 处理
对于一个站点来说,URL 的组织是最重要的一个部分,因为这是用户看得到的部分,而且直接影响到站点是如何工作的,在著名的站点如:del.icio.us ,其URLs 甚至是网页界面的一部分。而web.py 以简单的方式就能够构造出一个强大的URLs。
在每个web.py 应用,必须先import web 模块:
1 import web
现在,我们须要告诉web.py URL 如何组织,让我们以一个简单例子开始:
12 urls = ('/', 'index' )
在上面的例子中,第一部分(‘/’)是一个匹配URL 的正则表达式,像/,/help/faq,/item/(\d+),等等;第二部分(‘index’)是一个类名,匹配的请求将会被发送过去。
现在,我们需要编写index 类。当大部人浏览网页的时候,他们都没有注意到,浏览器是通过HTTP 跟World Wide Web 通信的。通信的细节不太重要,但要明白一点,用户是通过URLs(例如 / 或者 /foo?f=1)来请求web 服务器完成一定请求的(例如 GET 或者POST)。
GET 是最普遍的方法,用来请求一个页面。当我们在浏览器里输入“harvard.edu” 的时候,实际上它是向Web 服务器请求GET ”/“。另一个常见的方法是POST,常用于提交特定类型的表单,例如利用信用卡付费和处理一个订单。注意,GET URLs 能够被搜索引擎索引得到(想像一下Google 尝试购买你网站上的所用物品)。
在我们的web.py 代码中。我们清晰区分这两种方法:
1 2 3 |
class index: def GET(self): print "Hello, world!" |
当接收到一个GET 请求时,上面的GET 方法将会被web.py 调用。
好的。现在,我们只需添加最后一行代码,让web.py 启动网页应用:
1 |
if __name__ == "__main__": web.run(urls, globals()) |
上面告诉web.py 如何配置URLs,以及找寻的类在文件中的全局命名空间。
整个code.py 文件的内容如下:
1 2 3 4 5 6 7 8 9 10 |
import web urls = ( '/', 'index' ) class index: def GET(self): print "Hello, world!" if __name__ == "__main__": web.run(urls, globals()) |
注意到没有,虽然我说了很多东西,但实际上web 应用的代码就只得上面的几行,而且这是一个完整的web.py 应用。在你的命令行下输入:
1 2 |
$ python code.py Launching server: http://0.0.0.0:8080/ |
现在,你的web.py 应用已经启动了服务器。通过浏览器访问http://localhost:8080/ 的话,会见到”Hello, world!“。在启动服务器的时候,你可以在python code.py 后面添加IP 地址/端口 来控制web.py 启动的服务器。例如:python code.py 8888。
3. 调试
web.py 本身也提供调试的工具。在最后的“if name …” 代码前面添加:
1 |
web.webapi.internalerror = web.debugerror |
并在最后的“if name …” 添加”web.reloader“:
1 |
if __name__ == "__main__": web.run(urls, globals(), web.reloader) |
上面的代码会使你在调试的阶段得到更多有用的信息。web.reloader 其实是一个中间件,当你在运行时修改了code.py 文件后,web.reloader 会重新加载code.py 文件,让你在浏览器上立刻可以看到变化。如何有多何变化的话,还是需要重新启动服务器。web.py 也提供web.profiler ,可以输出有用的信息,有关每个页面的每个函数调用的次数,这用助于你改善代码。
4. 模板
在Python 里面编写HTML 代码是相当累赘的,而在HTML 里嵌入Python 代码则有趣得多。幸运地,web.py 使这过程变得相当容易。
注意:旧版本的web.py 是用Cheetah templates 模板的,你可以继续使用,但官方已不再提供支持。
在我们的web 应用里,添加一个新的文件夹用来组织模板文件(例如”/templates“)。然后再新建一个HTML 文件(例如:”index.html“):
1 <em>Hello</em>, world!
或者,你可以用web.py 的模板语言用编写这个HTML 文件:
123456 $def with (name)$if name:I just wanted to say <em>hello</em> to $name.$else:<em>Hello</em>, world!
注意上面代码的缩进!
正如你所见的,上面的模板看上去跟这Python 文件很相似,以def with 语句开始,但在关键字前需要添加”$“。
注意:在模板内的变量,如果包含有HTML 标记,以$ 方式引用变量的话,HTML 标记只会以纯文本的显示出来。要想HTML 标记产生效果,可以用$: 引用变量。
现在,回到code.py 文件,在”import web” 的下一行添加:
1 render = web.template.render('templates/')
这告诉web.py 在哪里可以搜索得到模板目录。
提示:可在render 调用里添加cache = False 使得每次访问页面时都重载模板。
下面继续修改code.py 文件的GET 方法:
123 def GET(self):name = 'Bob'print render.index(name)
上面的”index“ 是模板的名字,”name“ 是传递过去的参数。
修改code.py 文件的urls 变量:
12 urls=('/(.*)', 'index')
上面的“/(.*)” 是一个正则表达式。
再将GET 方法修改如下:
12 def GET(self,name):print render.index(name)
现在,访问”/“的话,会显示”Hello, world!“;访问”/Joe“ 的话,会显示”I just want to say hello to Joe“。
如果你想学习更多关于web.py templates 的话,可以访问templetor page。
5. 数据库
注意:在你开始连接数据库之前,请先安装正确的数据库驱动。例 如,MySQL 使用MySALdb,Postgre 使用psycopg2。
添加以下代码,则可以正确配置你的数据库:
123456 web.config.db_parameters = dict(dbn='postgres',</code><code> </code><code>user='username',</code><code> </code><code>pw='password',</code><code> </code><code>db='dbname')
现在,先行在数据库里创建一个简单的表:
123456 CREATE TABLE todo (id serial primary key,title text,created timestamp default now(),done boolean default 'f');
初始化一行:
1 INSERT INTO todo (title) VALUES ('Learn web.py');
回到code.py,修改GET 方法如下:
123 def GET(self):todos = web.select('todo')print render.index(todos)
修改urls 变量:
12 urls = (</code> <code>'/', 'index')
重新编辑index.html 文件如下:
12345 $def with (todos)<ul>$for todo in todos:<li id="t$todo.id">$todo.title</li></ul>
现在,可以访问”/“,如果显示”Learn web.py“,则祝贺你成功了!
现在,再让我们看看如何向数据库写入。
在index.html 文件的尾部添加如下内容:
123456 <form method="post" action="add"><p><input type="text" name="title" /><input type="submit" value="Add" /></p></form>
修改code.py 文件的urls 变量如下:
1234 urls = (</code><code>'/', 'index','/add', 'add')
在code.py 里添加一个类:
12345 class add:def POST(self):i = web.input()n = web.insert('todo', title=i.title)web.seeother('/')
web.input 使你能够方便地访问用户通过表单提交上来的变量。web.insert 用于向数据库的 “todo” 表插入数据,并且返回新插入行的ID。web.seeother 用于重转向到”/“。
提示:对于数据库的操作,还有web.transact(), web.commit(), web.rollback(),web.update()。
在web.py 里,还有web.input,web.query 和其它的函数,返回”Storage objects”,可以像字典型类(dictionaries) 的使用。
6. 总结
web.py 的确相当的小巧,应当归属于轻量级的web 框架。但这并不影响web.py 的强大,而且使用起来很简单、很直接。在实际应用上,web.py 更多的是学术上的价值,因为你可以看到更多web 应用的底层,这在当今“抽象得很好”的web 框架上是学不到的 :) 如果想了解更多web.py,可以访问web.py 的官方文档。
这篇教程到这里也要结束了,如果你对web.py 有兴趣,可以搜索更多关于web.py 的文档看看,你一定会发现更酷的东西。Have fun!
程序本天成,妙手偶得之!我们只是代码的搬运工!
转载请注明:http://www.521php.com/archives/1890/
2017年10月28日 上午 2:22 Luthertow | 引用 | #11
阿尔法狗再进化http://www.sxusa.net
人民币对美元汇率http://www.sxusa.net
母其弥雅http://bbs.dncjj.com
趣历史http://www.zykmw.net/
云南野生蘑菇王http://www.abintra.net
尬舞在尴尬中退潮http://www.akhkpt.cn
蒂勒森突访阿富汗http://www.frqjj.com
edg战队http://bbs.dphjj.com
唯美图片http://www.zix-g.com/
日本连摔两架战机http://www.eosmaiL.net
陆金所http://www.dncjj.com
中国化肥网http://www.daimuda.com/
纹身秀http://www.hxvux.com/
风语者http://bbs.bxnqmd.cn
北京摇号http://www.sxusa.net
意甲http://bbs.dhqjj.com
欧冠http://bbs.dcqjj.com
统一下载站http://www.7seuu.com/
美金对人民币的汇率http://www.dhqjj.com
广州马拉松http://bbs.fgqjj.com
兄弟驯蜂年入百万http://www.aosights.com
深港DJ总站http://www.fatmomsex.com/
白领辞职做少庄主http://www.abintra.net
学佛网http://www.hg2017h.cn/
纹身秀http://www.hxvux.com/