注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

江志祥的博客

可恶的中国银行,信用卡像病毒啊,取消那么难,,,

 
 
 

日志

 
 

Bottle:简单的Python Web框架  

2014-03-03 00:04:37|  分类: 计算机-Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  1.  
  2. from bottle import route, run
  3.  
  4. @route('/hello')
  5. def hello():
  6. return "Hello World!"
  7.  
  8. run(host='localhost', port=8080)
CODE INFO

Bottle简单使用

Bottle是一个基于Python的快速的,简单的,轻量级的遵循WSGI的微型Web框架,它最大的特点就是,它只有一个文件,可以方便的直接集成到自己的项目之中。

  • 路由:Bottle和DjangoTornado不同,网址路由的设定不是单独配置,它采用的是一种函数装饰器的方法,这点和Flask比较像。
  • 模板:Bottle自带一个快速的,pythonic的模板引擎,和Bottle轻巧的风格很搭配,当然,你或许喜欢jinja2,mako或者cheetah,而Bottle支持这些模板引擎。
  • 基本功能:表单处理,文件上传,cookies等,可以直接使用。
  • 发布应用:Bottle支持发布的服务器可以说是WSGI的聚会, 如paste, fapws3, bjoern, Google App Engine, cherrypy等等,当然,SAE已经支持Python,而且支持Bottle了。

在介绍简要介绍之前,来一段简单的示例,我们依然使用那个不能再经典的页面了。

  1. from bottle import route, run
  2.  
  3. @route('/hello/<name>')
  4. def index(name='World'):
  5. return '<b>Hello %s!</b>' % name
  6.  
  7. run(host='localhost', port=8080)

把这个保存为hello.py,然后执行python hello.py,打开http://localhost:8080/hello/world,就这么简单。

基本指南

下面是一个已经非常熟悉的Hello World页面的例子,在这个例子中,可以清楚的明白Bottle的基本使用方法。

  1. from bottle import route, run
  2.  
  3. @route('/hello')
  4. def hello():
  5. return "Hello World!"
  6.  
  7. run(host='localhost', port=8080)

第一句,是导入需要的相关方法和内容,现在这个简单的页面只需要routerun就行了,Bottle使用这个叫route的函数装饰器来引导路由,@route('/hello')的意思就是,当访问'/hello'这个网址的时候,将由hello()这个函数来处理请求,在这个例子中,我们就只是简单的返回Hello World!这个句子,当然,你可以做更多事。

然后是run(host='localhost',port=8080),这个就是启动服务,然后监听8080端口,当然,你可以改变端口号,如果使用默认的,直接run()就可以了。

还有另外一种工作方式,上面直接使用@route,这是一个全局的路由配置,什么意思呢?就是所有相对于网站根目录的请求都会去匹配,如果你需要比较模块化的网站,你或许可以尝试下面这种方法:

  1. from bottle import Bottle, run
  2.  
  3. app = Bottle()
  4.  
  5. @app.route('/hello')
  6. def hello():
  7. return "Hello World!"
  8.  
  9. run(app, host='localhost', port=8080)

这样,路由设定就是针对app这个应用了。

路由设置

上面已经提到过,@route('/hello')可以将访问"/hello"的请求映射到这个装饰器修饰的函数进行处理,那么,如何接受网址里的参数呢,比如这样的网址“/hello/SErHo”,怎么能得到“SErHo”?

  1. @route('/') #加上这一句表示,这个请求也映射到这个函数,是不是很有趣呢?
  2. @route('/hello/<name>')
  3. def greet(name='Stranger'):
  4. return 'Hello %s, how are you?' % name

对,就像上面这样就行了,你只需要将你需要获得的变量使用<>包围起来就行了,我们需要更强大的匹配方法,可以使用<name:filter>和<name:filter:config>这种方法,比如下面:

  1. #下面这个只匹配整数,比如'/object/2',如果访问'/object/hello'就会出错
  2. @route('/object/<id:int>')
  3. def callback(id):
  4. assert isinstance(id, int)
  5.  
  6. #下面这个会匹配小写的英文字符,比如'/object/serho'
  7. @route('/show/<name:re:[a-z]+>')
  8. def callback(name):
  9. assert name.isalpha()
  10.  
  11. #下面这个是用于静态文件访问的,后面会有详细介绍
  12. @route('/static/<path:path>')
  13. def callback(path):
  14. return static_file(path, ...)

通过上面的例子,可以看出匹配支持的几种过滤方式:

  • :int:匹配整数
  • __:float:和:int类似,不过可以匹配更大范围的数字
  • :re :使用正则表达式进行匹配
  • :path:匹配目录,主要用于文件下载和静态文件访问
  评论这张
 
阅读(99)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017