博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python bottle 简介
阅读量:6318 次
发布时间:2019-06-22

本文共 3897 字,大约阅读时间需要 12 分钟。

   是一个轻量级的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 ['

Hello world!

'] 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 runimport gevent.monkeygevent.monkey.patch_all() if __name__ == '__main__':    def application(environ, start_response):        start_response('200 OK', [('Content-Type', 'text/html')])        return ['

Hello world!

'] 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 ,简化后的代码如下:

1   def _handle(self, environ):2         self.trigger_hook('before_request')3         route, args = self.router.match(environ)4         out = route.call(**args)5         self.trigger_hook('after_request')6         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 Run as FastCGI process
gae Helper for Google App Engine deployments
wsgiref Single-threaded default server
cherrypy Multi-threaded and very stable
paste Multi-threaded, stable, tried and tested
rocket Multi-threaded
waitress Multi-threaded, poweres Pyramid
gunicorn Pre-forked, partly written in C
eventlet Asynchronous framework with WSGI support.
gevent Asynchronous (greenlets)
diesel Asynchronous (greenlets)
fapws3 Asynchronous (network side only), written in C
tornado Asynchronous, powers some parts of Facebook
twisted Asynchronous, well tested but... twisted
meinheld Asynchronous, partly written in C
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;

转载地址:http://kucaa.baihongyu.com/

你可能感兴趣的文章
PHP中实现函数重载
查看>>
白宫电子邮件系统疑被黑:第一夫人护照信息被曝光
查看>>
惠州智慧城市建设提速 时空信息云平台争取明年投入运营
查看>>
SDN能解决很多问题,但不包括安全
查看>>
站在物联网风口,传感器产业弯道超车?
查看>>
Javascript类型转换的规则
查看>>
vue js 判断鼠标滚动到底部 数据更新
查看>>
一个ios的各种组件、代码分类,供参考
查看>>
Shell脚本学习之sed详解
查看>>
bugDone
查看>>
Go:json(序列化、反序列化)
查看>>
Python 类的用法
查看>>
动态链接和静态链接的区别
查看>>
解决Python开发过程中依赖库打包问题的方法
查看>>
Git学习系列之命令大全(二)
查看>>
java基础(五)-----关键字static
查看>>
什么是PLI?
查看>>
[UIKit学习]04.关于HUD提示框,定时任务、开发关于资源常见问题
查看>>
文摘:OUTER JOIN
查看>>
http://git.oschina.net/chunanyong/springrain
查看>>