Bottle
提示:使用此WEB服务器模块需要有基本的HTTP知识
简单、轻量级指的是:上手不难、容易使用、模块不大还能完成一般Web服务器的功能。Bottle是Python平台的轻量级Web Server(准确的说是HTTP Server)模块,没有其它依赖库,支持Post/Get提交数据、上传文件等功能,还支持简单的网页模板。基本处于常用功能都有,但每个方面都跟专业有很大差距的情况,所以它的定位就不是取代专业Web Server的。
Bottle官方网址 bottlepy.org 英文文档全面。配置语法虽多但都不难
我自己拿Bottle是用来代替 tkinter 界面。在Python中如果编写一个TK界面,在处理大量列表数据时,界面拉伸总需要改来改去的。而且界面越高级,tkinter越繁杂,都不如直接用TCL/TK画界面再调用Python了。但这样处理Python的返回结果又很麻烦,所以干脆就换Web界面来管理Python程序。Bottle在小局域网几个人用没问题,没做过负载测试(看Bottle源码,使用的是threading线程)。
Bottle的使用方法跟Java平台的JLhttp很像(Java轻量级Web伺服器),但是我感觉JLhttp在国内好像用的人也不多,如果你没听说过就把这句忽略吧。
import bottle
@bottle.route('/')
def 首页():
return "Hello World!"
bottle.run(host='localhost', port=8080, debug=True)
解释一下上面几段代码的含义,导入bottle模块。Bottle使用了@装饰器语法来进行配置,从语法角度来说增加了初学者的负担(毕竟不像Java注解那么多),但bottle这里很节省代码量。
@bottle.route('/') 表示接下来的自定义函数负责处理网站"/"根目录的请求。网站和HTTP基础知识我就不解释了。
def 首页(): 自定义函数,函数名随意起,懒得写注释,我用bottle时所有的函数名都是中文写明用途。
return "Hello World!" 这里表示返回给网页的内容,正常应该是html代码。
上面三句体现了Bottle的模式:@装饰器声明哪些网址(网站路径)要被处理。紧接的def函数处理相关的网址;处理完毕后return结果。
bottle.run(host='localhost', port=8080, debug=True) 网站配置完毕后,启动bottle伺服器。
host表示接受的IP地址(localhost表示本机)。port表示绑定的端口。debug表示有问题时显示详细错误。
一些使用例子
静态网页
return bottle.static_file('index.html', 静态页所在的文件夹路径)
静态文件自动映射
@bottle.route('/')
def 静态文件自动映射(filepath):
return bottle.static_file(filepath, 文件夹路径)
这是自动映射网页的静态内容,比如html网页、图片、js脚本和css等等。一般网页都需要很多静态内容,如果都像上面那么映射就没法活了。
特别需要注意的是,如果有其它子目录映射,根目录的静态文件映射必须放在子目录映射之后,否则会拦截子目录的映射。
接受Post信息
@bottle.route('/posttest', method='POST')
def 接收信息测试():
if not bottle.request.forms.get('postxinxxi'):
return "信息为空!"
@表示在posttest网址上接收网页发来的post信息。注意,此时直接访问posttest网址是无效的。
POST数据通过bottle.request.forms.get('postxinxxi')来取得,本例中网页端发来的数据ID是postxinxxi。
双装饰器,即接受数据也可以访问
@bottle.route('/Ptest')
@bottle.route('/Ptest', method='POST')
def XXXX……
上面提到接收POST数据的网址不能直接访问,如果想要一个网页即可以访问也可以接收数据,就需要用双装饰器。
文件上传(借用官方例子)
@route('/upload', method='POST')
def 文件上传并通过后缀扩展名验证上传类型():
upload = request.files.get('upload')
filename, 后缀扩展名 = os.path.splitext(upload.filename)
if 后缀扩展名 not in ('.png','.jpg','.jpeg'):
return '上传文件类型错误'
upload.save(保存文件的路径bottle自动在路径后追加文件名)
return '上传成功'
比官方例子有精简,突出了上传部分,获取上传内容通过request.files.get实现。其它重点部分都改成中文放在代码里了,希望你们能看懂。此外关于request的类型,官方文档里有详细的列表:
网页模板
bottle.TEMPLATE_PATH = 模板目录
先需要设定模板目录,然后在def自定义函数中return部分指定模板
return bottle.template('模板文件名,不用写后缀', zidingyi='自定义的模板字段')
模板部分要细说有点长,我大概介绍下流程:先创建HTML文件,然后在HTML需要动态变换的部分添加{{!zidingyi}}这样的自定义字段。在Python程序里计算自定义字段的最终值,并在return时,指定刚才建立的模板文件名,并且把最终值赋值给zidingyi,模板显示的时候{{!zidingyi}}那里就会变成Python给的最终值。
此外模板还支持一部分Python语法,详细用法看官方文档吧。教程是渐进式的,每看一部分就可以使用一些功能。
更多的Cookie、插件等内容我没有用到,请去官方文档查看。文档虽然不是面面俱到但都是渐进式的,而且每部分都配合代码例子,对照观看还是很容易的。