前言

之前用 Python 为 Mmrz 项目写了一个同步服务器 Mmrz-Sync. 当时使用的是最基本的 WSGI 作为服务器, 感觉还是不太方便, 有些地方写起来比较烦琐. 后来写 Ruby 的时候接触到 Ruby 有一个轻量级框架 Sinatra 感觉特别舒服, 我就觉得 Python 必然也有一个类似的轻量级框架. 后来在 V2EX 上看到有人提到一个叫做 Bottle 的轻量级 Python 框架, 我想这就是我要找的东西了...


启动

首先直接在官网下载 bottle.py 放入项目中即可. 然后如下操作就可以启动一个服务器了:

from bottle import route, run, template, request

@route('/')
def index():
    return "Hello, world!!!"

run(host='localhost', port=8086)

此时访问 http://localhost:8086 就可以看到熟悉的 Hello World!!! 了.


获取参数

目前查到的内容如下:

内容 代码
获得GET方法的参数 request.params
获得POST方法的参数 request.forms
获得FILE中的内容 request.files

一些坑

  1. 目前 Mmrz-Sync 已经正式启用 Bottle 作为框架提供服务了. 然后在使用 Mmrz 做测试时候发现了一个问题, 就是无法上传单词本. 经过调查尝试后发现是上传单词本使用的是 post 请求, 且附带了一个非常大的参数(因为整个单词本是作为参数上传的, 可以达到数 Mb 的体积). 此时 Mmrz 客户端会报出一个 "broken pipe" 的错误. 这在之前是没有问题的, 于是猜测是 Bottle 对 post 请求的数据大小做了限制. 通过搜索 StackOverflow 找到了答案. 只需要对 bottle.BaseRequest.MEMFILE_MAX 进行设置即可. 例如设置为 bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024. 这样 Bottle 便可以接受更大的请求数据了. StackOverflow 的上该回答的参考连接请点击 这里.


  2. 如果要引用静态文件的话, 居然不是自动的!!! 在 Sinatra 中, 只需要把静态文件比如 css 或者 js 文件放在 public 文件夹下即可. 而在 Bottle 除了要放在 static 文件夹下, 还需要手动指定路由!!! 例如想引用 static 文件夹下的 style.css 这个文件, 需要在 Python 文件中手动添加如下路由方可访问:

    @route('/<filename>')
    def server_static(filename):
        return static_file(filename, root='./static')
    

    只有这样设置以后才能通过 http://url/style.css 的路径访问到你想访问的 css 文件.
    另外如果想访问 staic/css 文件夹下的 style.css 文件, 则需要另外再添加如下一条路由方可访问:

    @route('/css/<filename>')
    def server_static_css(filename):
        return static_file(filename, root='./static/css')
    

    这样设置以后才可以通过 http://url/css/style.css 访问该 css 文件.


如何支持多线程

Bottle 默认支持的是单进程阻塞式的服务器. 比如对于同一个路由 "/example", 用户A访问且因网络原因通信尚未结束的时候是无法响应用户B的请求的. 解决办法也比较简单, 可以用在启动的时候引入一个支持多线程的服务器比如 paste 即可. 可以参考官方文档 Deployment 部分.

阻塞式:

run(host='0.0.0.0', port=8080)

多线程:

run(host='0.0.0.0', port=8080, server='paste')

值得查考的文章:
用Bottle开发web程序(一)
用Bottle开发web程序(二)
微型 Python Web 框架: Bottle


写在最后

未完待(bu)续...

Comments
Write a Comment