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