bottle是一个轻量级的python web框架, 可以适配各种web服务器,包括python自带的wsgiref(默认),gevent, cherrypy,gunicorn等等。bottle是单文件形式发布,源码在这里可以下载,代码量不多,可以用来学习web框架。这里也有官方文档的中文翻译。
 
  首先我们来运行一下bottle的hello world
from bottle import run

if __name__ == '__main__':
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return ['<h1>Hello world!</h1>'] run(host='localhost', port=8080, app=application)
  上面的代码看起来也非常符合wsgi的接口规范。启动改代码,可以看到输出
        Bottle v0.13-dev server starting up (using WSGIRefServer())...
        Listening on http://localhost:8080/
        Hit Ctrl-C to quit.
  
  输出中加粗部分表明使用的web服务器是python自带的wsgiref。也可以使用其他web server,比如gevent,前提是需要安装gevent,修改后的代码如下:
from bottle import run
import gevent.monkey
gevent.monkey.patch_all() if __name__ == '__main__':
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return ['<h1>Hello world!</h1>'] run(host='localhost', port=8080, app=application, server = 'gevent')

通过server关键字指定web服务器为‘gevent’,输出的第一行变成了:

    Bottle v0.13-dev server starting up (using GeventServer())...
 
不管bottle用什么web服务器启动,在浏览器输入127.0.0.1:8080,都可以看到
    
 
 
 
下面介绍bottle中部分类和接口
bottle.Bottle
    代表一个独立的wsgi应用,由一下部分组成:routes, callbacks, plugins, resources and configuration。
    __call__: Bottle定义了__call__函数, 使得Bottle的实例能成为一个callable。在前文提到,web框架(或Application)需要提供一个callbale对象给web服务器,bottle提供的就是Bottle实例
    def __call__(self, environ, start_response):
  """ Each instance of :class:'Bottle' is a WSGI application. """
return self.wsgi(environ, start_response)
    下面是Bottle.wsgi函数的核心代码,主要调用两个比较重要的函数:_handle, _cast
    def wsgi(self, environ, start_response):
""" The bottle WSGI-interface. """
try:
out = self._cast(self._handle(environ))
# rfc2616 section 4.3
if response._status_code in (100, 101, 204, 304)\
or environ['REQUEST_METHOD'] == 'HEAD':
if hasattr(out, 'close'): out.close()
out = []
start_response(response._status_line, response.headerlist)
return out

  _handle:处理请求,最终调用到application ,简化后的代码如下:

   def _handle(self, environ):
self.trigger_hook('before_request')
route, args = self.router.match(environ)
out = route.call(**args)
self.trigger_hook('after_request')
return out
  
  _cast: 
       标准的wsgi接口对Application的返回值要求严格,必须迭代返回字符串。bottle做了一些扩展,可以允许App返回更加丰富的类型,比如dict,File等。 _cast函数对_handle函数返回值进行处理,使之符合wsgi规范
 
bottle.Route
    封装了路由规则与对应的回调
 
bottle.Router
    A Router is an ordered collection of route->target pairs. It is used to  efficiently match WSGI requests against a number of routes and return the first target that satisfies the request.
 
ServerAdapter
    所有bottle适配的web服务器的基类,子类只要实现run方法就可以了,bottle里面有大量的Web服务器的适配。下表来自官网,介绍了bottle支持的各种web服务器,以及各自的特性。

Name Homepage Description
cgi
 
Run as CGI script
flup flup Run as FastCGI process
gae gae Helper for Google App Engine deployments
wsgiref wsgiref Single-threaded default server
cherrypy cherrypy Multi-threaded and very stable
paste paste Multi-threaded, stable, tried and tested
rocket rocket Multi-threaded
waitress waitress Multi-threaded, poweres Pyramid
gunicorn gunicorn Pre-forked, partly written in C
eventlet eventlet Asynchronous framework with WSGI support.
gevent gevent Asynchronous (greenlets)
diesel diesel Asynchronous (greenlets)
fapws3 fapws3 Asynchronous (network side only), written in C
tornado tornado Asynchronous, powers some parts of Facebook
twisted twisted Asynchronous, well tested but... twisted
meinheld meinheld Asynchronous, partly written in C
bjoern bjoern Asynchronous, very fast and written in C
auto
 
Automatically selects an available server adapter

    可以看到,bottle适配的web服务器很丰富。工作模式也很全面,有多线程的(如paste)、有多进程模式的(如gunicorn)、也有基于协程的(如gevent)。具体选择哪种web服务器取决于应用的特性,比如是CPU bound还是IO bound
 
bottle.run
    启动wsgi服务器。几个比较重要的参数
    app: wsgi application,即可以是bottle.Bottle 也开始是任何满足wsgi 接口的函数
    server: wsgi http server,字符串
    host:port: 监听端口
    
    核心逻辑:
    ServerAdapter.run(app)。
 
最后,bottle源码中有一些使用descriptor的例子,实现很巧妙,值得一读,前文也有介绍。
 
references;

python bottle 简介的更多相关文章

  1. python bottle框架

    python bottle框架 简介: Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. Bottl ...

  2. python bottle框架(WEB开发、运维开发)教程

    教程目录 一:python基础(略,基础还是自己看书学吧) 二:bottle基础 python bottle web框架简介 python bottle 框架环境安装 python bottle 框架 ...

  3. Python+Bottle+Sina SAE快速构建网站

    Bottle是新生一代Python框架的代表,利用Bottle构建网站将十分简单. Sina SAE是国内较出名的云平台之一,十分适用于个人网站的开发或创业公司网站开发. 下面将介绍如果通过Pytho ...

  4. Python的简介以及安装和第一个程序以及用法

    Python的简介: 1.Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.Pytho ...

  5. 解决基于BAE python+bottle开发上的一系列问题 - artwebs - 博客频道 - CSDN.NET

    解决基于BAE python+bottle开发上的一系列问题 - artwebs - 博客频道 - CSDN.NET 解决基于BAE python+bottle开发上的一系列问题 分类: python ...

  6. [Python] heapq简介

    [Python] heapq简介 « Lonely Coder [Python] heapq简介 judezhan 发布于 2012 年 8 月 8 日 暂无评论 发表评论 假设你需要维护一个列表,这 ...

  7. 让python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE等请求

    这两天在用python的bottle框架开发后台管理系统,接口约定使用RESTful风格请求,前端使用jquery ajax与接口进行交互,使用POST与GET请求时都正常,而Request Meth ...

  8. Python单元测试简介及Django中的单元测试

    Python单元测试简介及Django中的单元测试 单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架. 单元测试与功能测试都是日常开发中必不可少的部分 ...

  9. Python列表简介和遍历

    一.Python3列表简介 1.1.Python列表简介 序列是Python中最基本的数据结构 序列中的每个值都有对应的位置值,称之为索引,第一个索引是0,第二个索引是1,以此类推. Python有6 ...

随机推荐

  1. jQuery学习笔记—— .html(),.text()和.val()的使用

    本节内容主要介绍的是如何使用jQuery中的.html(),.text()和.val()三种方法,用于读取,修改元素的html结构,元素的文本内容,以及表单元素的value值的方法.jQuery中为我 ...

  2. [iOS Animation]-CALayer 图像IO

    图像IO 潜伏期值得思考 - 凯文 帕萨特 在第13章“高效绘图”中,我们研究了和Core Graphics绘图相关的性能问题,以及如何修复.和绘图性能相关紧密相关的是图像性能.在这一章中,我们将研究 ...

  3. list集合怎么转化成一个javaBean对象,及常见的使用方法(全)

    一.List集合的用法 1.list集合添加实体并输出 for (int i = 0; i < list.size(); i++) { javabean obj= (javabean)list. ...

  4. 170112、solr从服务器配置整合到项目实战

    整合网上资源后 100%可运行的配合步骤,部署在tomcat 为例. 一:下载solr,版本为5.2.1 地址:http://pan.baidu.com/s/1eRAdk3o 解压出来. 1.在解压的 ...

  5. 关于JAVA中hashCode

    hash code 即散列码根据对象计算出的一个整型值,散列码是没有规律的. 如果两个对象相等(equal() 返回true),则hashCode一定相等,如果两个对象hashCode相等,则对象不一 ...

  6. 在Android studio环境下使用EventBus

    EventBus是一个订阅/发布消息总线,实现在应用程序里面,组件之间,线程之间的通信.因为event是任意的类型,所以这个使用起来非常方便. eventbus中的角色: event:当然就是事件啦 ...

  7. laravel5 数据库连接问题

    [PDOException] SQLSTATE[28000] [1045] Access denied for user ‘homestead’@’localhost’ (using password ...

  8. PHP利用数组构造JSON

    问题起因 以往都是直接用构造数组的形式构造json 例子: $arr = array("A"=>"1","B"=>"2 ...

  9. Java动态数组

    其中java动态数组: Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList. ...

  10. iOS 之 系统机制

    iOS 沙盒 iOS 8 之 新特性 iOS 操作系统整体架构层次讲解