Bottle 是一个非常精致的WSGI框架,它提供了 Python Web开发中需要的基本支持:URL路由,Request/Response对象封装,模板支持,与WSGI服务器集成支持。整个框架的全部代码约有 2000行,它的核心部分没有其他任何依赖,只要有Python环境就可以运行。

Bottle适用于小型的Web开发,在应用程序规模比较小的情况下可以实现快速开发。但是由于自身功能所限,对于大型的Web程序,Bottle的功能略显不足,程序员需要手动管理模块、数据库、配置等等,与Pylons等框架相比Bottle的优势就难以体现出来了。

快速入门

通过一个简单的、典型的例子描述Bottle的使用:

from bottle import Bottle, run, mako_view, request

myapp = Bottle()

@myapp.get('/hello/:name/:count#\\d+#')

@mako_view('hello')

def hello(name, count):

ip = request.environ.get('REMOTE_ADDR')

return dict(n=name, c=int(count), ip=ip)

run(app=myapp)

我们创建一个Bottle对象,通过decorator配置一条路由记录。Bottle的url映射支持具名参数,“/hello/:name/:count#\\d+#” 格式的参数,可以匹配/hello/(.+?)/(\d+?)的 URL。在方法体中,通过environ字典获得客户端IP,这个操作和其他WSGI框架是一致的。接着通过一个字典类型将Model数据传递给 View。View模板通过decorator定义,采用mako模板引擎实现,模板名为hello,他表示在当前目录下一个名叫hello.tpl的文 件。

剖析

Bottle主要可以分成4个模块:

Router和WSGI Application

Request和Response, Web helpers

Template Adapters

WSGI Server Adapters

Router和WSGI Application

一个Bottle对象是一个标准的WSGI App,这使他可以与很多WSGI Server集成。每个app下管理一个Router用于针对URL映射到handler方法。根据Python decorator的特性,路由规则是在程序启动时自动执行的。

Bottle的route方法用于注册handler到router中。除此以外,还有很多function currying帮助您简单地路由GET / POST 等特定HTTP方法。

Bottle最近以来支持了hook,可以注册一些方法在每个请求之前、或之后执行。

当接受一个HTTP请求时,WSGI Server会调用WSGI App的wsgi方法。它的流程是:

根据标准的WSGI接口规范,从WSGI environ中生成一个Request对象,初始化一个response对象。

在寻找方法之前,实际上Bottle会自动执行您注册的before_hook。(Bottle._add_hook_wrapper)

根据request.path的URL在router中寻找对应的handler方法(Bottle.match_url, Router.match)。这一步中除了找到合适的handler方法,还要负责提取url中的具名参数,将结果以tuple的形式返回。

以返回的方法和参数,执行handler,获得返回值。

执行所有的after_hooks。

根据返回的不同类型,写入Response的头部。在这一步,Bottle还会应用一些filter,在Bottle中,filter是用于处理 handler返回类型的。例如,一个典型的filter即内置的dict2json,他将handler返回的dict类型自动换成 json。(Bottle._cast)

根据返回的HTTP状态码,对handler返回对象进行处理。调用WSGI Server的start_response方法将返回对象写给客户端。

Request和Response, Web helpers

Bottle对HTTP的请求和响应封装了Request和Response对象。它采用threadlocal的方式,由Bottle app管理生命周期。您可以在声明handler方法时不必像Java Servlet那样将他们以参数传入,这样增加了方法设计的灵活性,也使得单元测试变得相对轻松。

Request对象是对WSGI environ属性的封装,可以从中取得的属性取决于WSGI Server对 PEP333 的实现。

关于Request API,可以参考 文档

类似的,可以参考 Response API 了解如何对HTTP响应进行操作

和很多Web框架一样,你不必手动去设置HTTP重定向,helper方法会简化这些操作:abort, redirect, static_file。当然,你也可以自己创建一些helper。

Template Adapters

template方法用于渲染视图,您可以使用不同的模板实现:mako, jinja2, cheetah, simpletal以及Bottle自己的简单实现。

view作为一个decorator可以简化模板的选择。与route类似,作者也提供了一些function currying来支持mako_view这样简便的写法。

Server Adapters

Bottle的Server Adapters简直可以说是WSGI Server的博览会,从这里您可以了解目前比较流行的WSGI实现:

flup

wsgiref

cherrypy

paste

fapws3

tornado

Google Appengine

twisted

diesel

meinheld

gunicorn

eventlet

gevent

rocket

当然,这些不是全部,如果要使用不在其中的WSGI Server,您只需实现一个ServerAdapter的run方法即可,需要做的就是将Bottle app传给server并启动它。

内置的run方法用于启动服务,您还可以指定一个reloader参数使Bottle在后台检查源文件的修改情况,实现热加载。

除了run方式的启动,由于Bottle app本身就是一个符合标准的WSGI app,所以也可以通过一些服务器特有的方式启动服务,例如gunicorn:

gunicorn -w 2 -D -b 127.0.0.1:18080 module:app

实战Middlewares

Middleware是WSGI的重要概念http://www.python.org/dev/peps/pep-0333 /#middleware-components-that-play-both-sides 借助一些成熟的middleware可以添加一些Bottle目前不具备的功能:没错,Session。

Session Middleware最著名的选择叫做Beaker,要其用Beaker,只需要一个装饰器模式的App声明即可,您可以参考Beaker的 文档 .

Pylons以使用Middleware著称,而除了Routing这样核心的Middleware,包括Beaker和Authkit都可以应用在Bottle程序上。

App Mounting

Bottle的App提供一个很有用的mount方法帮助你将Web应用模块化。您可以将一个Bottle App挂载到一个父App上的某个路径,以父App启动后,父App可以为子App在一个路径下提供路由。

不过你会遇到这样的问题:

child = Bottle()

@child.get("/")

def hello():

return "hello world"

parent = Bottle()

parent.mount(child, "/child")

很自然的,您希望打开浏览器访问http://localhost:8000/child可能看到hello world,然后却得到404.这个问题不难察觉,于是访问http://localhost:8000/child/,工作正常。

我曾给作者提过这个问题http://github.com/defnull/bottle/issues#issue/88,(补一 句,Bottle的作者少有的Nice,对你提出的问题他通常都会认真解答),作者提了一个重定向的方式,不过还是没有决定把它直接加进mount方法 里。

那么,我们需要一个新的mount来支持http://localhost:8000/child

def mount(parent, child, path):

parent.mount(child, path)

@parent.get(path)

def redir():

redirect(path+"/")

Google AppEngine

因为有WSGI标准,你可以用Bottle开发Google AppEngine程序。您只需要在handler文件中加入这样的代码即可:

from google.appengine.ext.webapp.util import run_wsgi_app

def main():

run_wsgi_app(my_bottle_app)

if __name__ == '__main__':

main()

依赖?Bottle本身是self-contained,不过你可能还需要一个强大一些的模板引擎来完成你的应用,比如Mako。这样,你需要把依赖和自己的程序一起上传到GAE。对于Mako来说,除了它自己,还依赖marksave,别忘了它。

以上就是我对Bottle的理解和使用心得,希望您在合适的场景下使用Bottle,只有这样,才能感受到这个框架所带来的乐趣。

python bottle框架搭建_[深度分析] Python Web 开发框架 Bottle相关推荐

  1. python抽荣耀水晶_深度分析抽取荣耀水晶的窍门,不良抽法很好用,平均100RMB一颗...

    原标题:深度分析抽取荣耀水晶的窍门,不良抽法很好用,平均100RMB一颗 首先大家纠正一个概念,所有夺宝的事情要根据自己的财力去决定,分清楚到底是只要一个武则天,还是要3颗以上,分清楚目标才能做到滴水 ...

  2. python怎么避免浅拷贝_深度解读Python深拷贝与浅拷贝问题

    Illustrations by Leon Tukker ♚ 作者:PayneLi,Python全家桶,主要讲述数据挖掘.机器学习和深度学习领域的前沿技术,同时还会推荐一些行业最新论文.技术专家的经验 ...

  3. python垃圾回收价格表_深度解析Python垃圾回收机制(超级详细)

    我们知道,目前的计算机都采用的是图灵机架构,其本质就是用一条无限长的纸带,对应今天的存储器.随后在工程学的推演中,逐渐出现了寄存器.易失性存储器(内存)以及永久性存储器(硬盘)等产品.由于不同的存储器 ...

  4. python装饰器用法_深入浅出分析Python装饰器用法

    本文实例讲述了Python装饰器用法.分享给大家供大家参考,具体如下: 用类作为装饰器 示例一 最初代码: class bol(object): def __init__(self, func): s ...

  5. Doom Emacs入门:通过Doom Emacs框架搭建一个基本的Python开发环境及其基本操作

    Doom Emacs入门:通过Doom Emacs框架搭建一个基本的Python开发环境及其基本操作 一.写在前面 1.1 明确目标:搭建一个完整的Python开发环境 1.2 前置工作 二.Doom ...

  6. Python+Flask框架搭建可视化网站

    Python+Flask框架搭建可视化网站 一.项目结构 二.app.py from flask import Flask,render_template import sqlite3app = Fl ...

  7. python bottle框架搭建_python开发web服务 bottle框架

    开发功能不是特别复杂的web服务,可以考虑使用bottle框架.原因:一.Python开发效率高呀!不信你比比同样的功能Python几行可以搞定?换java试试?换C++试试?作为这几种语言都使用过的 ...

  8. python 爬虫框架对比_几种爬虫框架效果分析,python最好爬虫框架是哪一种?

    爬虫可以用不同的语言编写,而且爬虫框架也多,比如python,简单易学,也是有不同的爬虫框架,python最好爬虫框架是哪一种呢?这些爬虫框架都有什么优缺点? 一.爬虫框架使用对比分析 多学习爬虫的框 ...

  9. python gui开发工具_深入解析Python,透析应用开发,涵盖9大应用领域的Python框架...

    前言 当前,Python 已经成为最流行的程序设计语言之一,被越来越多的人作为首选语言来学习和应用.作为一种解释型的语言,Python具有内置的高级数据结构和简单有效的面向对象编程机制.同时,其语法简 ...

最新文章

  1. Oracle分页(limit方式的运用)
  2. python开源代码-mtcnn python 开源代码详细图解
  3. SpringBoot与quartz框架实现分布式定时任务
  4. react如何获取option的下标和值_react中option标签如何确定selected?
  5. mybatis 直接执行sql 【我】
  6. Unity 通过Unity Admob Plugin插件集成admob教程
  7. 【测试】禅道搭建在服务器上的操作步骤
  8. IBM server guide 下载地址及列表
  9. 在CMD里进行复制粘贴的方法
  10. HI3519移植samba服务器
  11. 数据库设计——概念模型
  12. HTB靶机:RainyDay
  13. Ubuntu 下安装VirtualBox主要步骤及出现的问题的解决方案
  14. 太阳直射点纬度计算公式_高中地理——每日讲1题(极昼、极夜、太阳高度角、太阳辐射)...
  15. Java 如何把gb2312编码转化为汉字(互转)
  16. Xposed框架动态调试第三方APP—实战演示
  17. Configure交叉编译
  18. DL实现semantic segmentation
  19. 微信小程序——开发介绍
  20. 2年Java开发工作经验面试总结

热门文章

  1. 高中教师资格证笔试计算机学科知识与能力,2019下半年浙江教师资格证高中《信息技术学科知识与教学能力》真题及答案解析...
  2. 提高IIS的FTP安全性 管理员的九阴真经
  3. STATA横向数据匹配
  4. 美发管理系统:初学者入门级C++
  5. ML学习笔记- 神经网络
  6. 光佩服别人排名做的好没有用,只有自己动手做才能成为自己的
  7. 京东屏蔽一淘 是“抗争”还是“遮丑”?
  8. Shell脚本生成字典实例分析
  9. 计算机考试准考证号格式
  10. 计算机主板的分类情况,计算机 主板的分类.ppt