网站首页 > 技术文章 正文
[视频] Python用Bottle模块开发简单的WEB服务器和网站
简单、轻量级指的是:上手不难、容易使用、模块不大还能完成一般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('/<filepath:path>')
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、插件等内容我没有用到,请去官方文档查看。文档虽然不是面面俱到但都是渐进式的,而且每部分都配合代码例子,对照观看还是很容易的。
猜你喜欢
- 2024-10-03 Python访问网络 urllib.request 发送HTTP 请求
- 2024-10-03 python模块之aioHttp 异步请求(在crm中,哪个模块用于跟踪和管理客户服务请求)
- 2024-10-03 推荐几个最佳python应用服务器(一起学习吧)
- 2024-10-03 让 HTTP 服务人类——Python Requests 模块基本用法总结
- 2024-10-03 关于爬虫,HTTP协议了解一下!(关于爬虫,http协议了解一下!正确的有)
- 2024-10-03 「Python」在HTTP请求使用长连接(keep-alive)提高传输效率
- 2024-10-03 干货分享丨Python的HTTP库及示例(http//www.python.org/downloads)
- 2024-10-03 微软太良心了,提供免费服务器可以搭建Python网站
- 2024-10-03 python爬虫必备库——requests(python爬虫需要的库)
- 2024-10-03 如何用Python语言开发大型服务器程序
- 10-02基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- 10-02Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- 10-02AWD-LSTM语言模型是如何实现的_lstm语言模型
- 10-02NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 10-02使用ONNX和Torchscript加快推理速度的测试
- 10-02tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- 10-02Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- 10-02Gateway_gateways
- 最近发表
-
- 基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- AWD-LSTM语言模型是如何实现的_lstm语言模型
- NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 使用ONNX和Torchscript加快推理速度的测试
- tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- Gateway_gateways
- Coze开源本地部署教程_开源canopen
- 扣子开源本地部署教程 丨Coze智能体小白喂饭级指南
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)