轻量的web框架Bottle
简洁的web框架Bottle
简介
Bottle是一个非常简洁,轻量web框架,与django形成鲜明的对比,它只由一个单文件组成,文件总共只有3700多行代码,依赖只有python标准库。但是麻雀虽小五脏俱全,基本的功能都有实现,很适合做一些小的web应用
开始使用
首先使用pip install bottle安装
然后是一个官方文档中的例子:
from bottle import route, run @route('/hello') def hello(): return "Hello World!" run(host='localhost', port=8080, debug=True)
what? 只有5行代码,只有一个文件,就能跑了?
这真是太简洁了,我觉得非常适合我们写一些小的web页面应用,比起使用django要快速的多
还可以用下边这种方式启动:
from bottle import Bottle
bt = Bottle()
@bt.route('/hello')
def hello():
return "Hello World!"
bt.run(host='localhost', port=8080, debug=True)
Bottle的实例对象同样拥有这些方法
url路由
静态路由
通过上面的例子可以看到,Bottle框架的路由方式是通过装饰器来实现的,像这样@bt.route(‘/hello’),这种方式和和flask的路由方式一样,同django就有大不同了
如果习惯了django的路由方式,再看到Bottle这种装饰器路由的方式,一定会觉得这样真是很快速,至少这是在同一个文件里
刚才的例子当中的路由方式是静态路由,下面是动态路由的方式
动态路由
我们看一下几种动态路由的方式
@route ('/ wiki / <pagename>' ) # pagename会成为参数
def show_wiki_page (pagename):
@route('/object/<id:int>') # 使用过滤器,id为名称,int是匹配方式,并且会自动转为int型
def callback(id): assert isinstance(id, int)
@route('/show/<name:re:[a-z]+>') # 可以使用正则表达式
def callback(name): assert name.isalpha()
@route('/static/<path:path>') # path的意义为以非贪婪的方式匹配包括斜杠字符在内的所有字符,并且可用于匹配多个路径段。
def callback(path): return static_file(path, ...)
# 等等
HTTP请求方法路由
这意味只匹配允许的请求方式
from bottle import get, post
@get('/login') # get方式的login
@post('/login') # post方式的login
#get(),post(),put(),delete()或patch()
@route('/hello/', method='POST') #通过参数决定,
内置模板
我们返回给客户端的内容不仅仅是字符串,更多的是html文件,如何返回html文件呢?
from bottle import Bottle,template
bt = Bottle()
@bt.route('/hello')
def hello():
return template('hello.html')
bt.run(host='localhost', port=8080, debug=True)
引入template后就可以使用模板了,那么hello.html是在哪里呢?
查看源码
TEMPLATE_PATH默认是/与/views下,当然也可以配置bottle.TEMPLATE_PATH来改变默认路径
除此之外模板同样允许在html中使用传入的参数,比如这样:
return template('hello.html',name='sfencs')
hello.html中:
hello{{name}}
不仅如此,模板还支持:
- % x = “sfencs” 一行python代码
- <% %> 之间是代码块
- % if True: if语句
% end - % for i in name: for循环语句
% end
使用函数
有一些内置函数可以直接在模板中使用
- include(sub_template, **variables)
可以导入其他的模板文件,例如:
% include('header.html', title='Page Title')
Page Content
% include('footer.html')
来导入header与footer,并且可以传入参数
- rebase(name, **variables)
例如:index.html中写:
% rebase('hello.html', title='Page Title')
<p>Page Content ...</p>
hello.html中写:
<html>
<head>
<title>{{title or 'No title'}}</title>
</head>
<body>
{{!base}}
</body>
</html>
作用相当于把index.html变为变量名为base的变量在hello.html中使用,并且可以传入参数,在服务的返回的页面还是index.html
from bottle import Bottle,template
bt = Bottle()
@bt.route('/hello')
def hello():
return template('index.html')
bt.run(host='localhost', port=8080, debug=True)
- defined(name)
检查变量是否被定义 - get(name, default=None)
获取变量的值 - setdefault(name, default)
变量设置默认值 - 自定义函数
也就是把函数传给模板使用
from bottle import Bottle,template
bt = Bottle()
@bt.route('/hello')
def hello():
return template('index.html',func=myfunc)
def myfunc():
return 'my func'
bt.run(host='localhost', port=8080, debug=True)
index.html中:
{{func()}}
request与response
http请求必然有request与response对象
使用request对象需要引入request
from bottle import request
这时在请求中便可获取request对象中的内容,例如:
from bottle import Bottle,template
from bottle import request,response
bt = Bottle()
@bt.route('/hello')
def hello():
print(request.headers)
return template('index.html')
bt.run(host='localhost', port=8080, debug=True)
request对象中还有很多属性
- request.headers请求头信息
- request.query get请求信息
- request.forms post请求信息
- request.files 上传文件信息
- request.params get和post请求信息
- request.GET get请求信息
- request.POST post和上传信息
- request.cookies cookie信息
- 等等
response对象使用是类似的:
from bottle import Bottle,template
from bottle import request,response
bt = Bottle()
@bt.route('/hello')
def hello():
response.add_header('sss','aaa')
return template('index.html')
bt.run(host='localhost', port=8080, debug=True)
这时在浏览器中能够找到响应头中多了sss
response的属性有:
- response.status_line 状态行
- response.status_code 状态码
- response.headers 响应头
- response.charset 编码
- response.set_cookie 在浏览器上设置cookie
- response.delete_cookie 在浏览器上删除cookie
- 等等
http错误与重定向
使用abort()来返回错误:
from bottle import route, abort @route('/restricted') def restricted(): abort(401, "Sorry, access denied.")
使用redirect()来重定向
from bottle import redirect @route('/wrong/url') def wrong(): redirect("/right/url")
服务器的使用
在执行run方法时,bottle默认使用wsgiref,wsgiref是开发时默认使用的单线程服务器,但通过指定参数可以改变服务器:
run(host='localhost', port=8080,server='paste')
具体可以使用哪些服务器可以参考http://www.bottlepy.org/docs/dev/deployment.html,
这里放一个截图
总结
在这里只是对Bottle框架的使用做了一个简单的介绍,具体学习还要参考官方文档
对于简单的web应用使用与web框架源码的学习,我认为Bottle是一个不错的选择。
轻量的web框架Bottle的更多相关文章
- Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器
最近在业余时间玩玩树莓派,刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚,从而控制LED发光二极管的闪烁,后来觉得,是不是可以使用HTML5+jQuery等流 ...
- 微型 Python Web 框架 Bottle - Heroin blog
微型 Python Web 框架 Bottle - Heroin blog 微型 Python Web 框架 Bottle
- Nancy总结(一)Nancy一个轻量的MVC框架
Nancy是一个基于.net 和Mono 构建的HTTP服务框架,是一个非常轻量级的web框架. 设计用于处理 DELETE, GET, HEAD, OPTIONS, POST, PUT 和 PATC ...
- 轻量型ORM框架Dapper的使用
在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射.其实对于EF吧,我说下我 ...
- Python Web框架 bottle flask
Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. 1 2 3 4 pip instal ...
- 基于轻量型Web服务器Raspkate的RESTful API的实现
在上一篇文章中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkate实现简单的RESTful API. 模块 首先让我们了解一下"模块&quo ...
- web框架--bottle
安装 2 3 4 pip install bottle easy_install bottle apt-get install python-bottle wget http://bottlepy.o ...
- 开源 , KoobooJson一款高性能且轻量的JSON框架
KoobooJson - 更小更快的C# JSON序列化工具(基于表达式树构建) 在C#领域,有很多成熟的开源JSON框架,其中最著名且使用最多的是 Newtonsoft.Json ,然而因为版本迭代 ...
- Prism-超轻量的开源框架
http://msdn.microsoft.com/en-us/library/ff648465.aspx prism 是微软模式与实践小组开发的一个进行MVVM模式开发,其中使用依赖注入等一些方法将 ...
随机推荐
- shiro源码篇 - 疑问解答与系列总结,你值得拥有
前言 开心一刻 小明的朋友骨折了,小明去他家里看他.他老婆很细心的为他换药,敷药,然后出去买菜.小明满脸羡慕地说:你特么真幸福啊,你老婆对你那么好!朋友哭得稀里哗啦的说:兄弟你别说了,我幸福个锤子,就 ...
- SpringBoot(6) SpringBoot配置全局异常
1.全局异常 @ControllerAdvice 如果是返回json数据 则用 RestControllerAdvice,就可以不加 @ResponseBody //捕获全局异常,处理所有不可知的异常 ...
- Dubbo 源码解析四 —— 负载均衡LoadBalance
欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 Dubbo 入门之二 --- 项目结构解析 Dubbo 源码分析系列之三 -- 架构原 ...
- 【Go】优雅的读取http请求或响应的数据
[Go]优雅的读取http请求或响应的数据 原文链接:https://blog.thinkeridea.com/201901/go/you_ya_de_du_qu_http_qing_qiu_huo_ ...
- SQLite与FMDB使用中区别
前几篇已经写完了SQLite与FMDB的基本内容以及衍生出来的知识点,我们这一篇主要讲述FMDB与SQLite在基本使用中的区别,大约需要5-10分钟时间讲述内容,欢迎大家指正. 基本使用区别 1.数 ...
- “笨方法”学习Python笔记(1)-Windows下的准备
Python入门书籍 来自于开源中国微信公众号推荐的一篇文章 全民Python时代,豆瓣高级工程师告诉你 Python 怎么学 问:请问你目前最好的入门书是那本?有没有和PHP或者其他语言对比讲Pyt ...
- C#窗体加载和控件加载不同步导致控件闪烁
窗体加载和控件加载不同步导致的控件闪烁现象:// 代码块加在父窗体中的任意位置,解决窗体加载和控件加载不同步导致的控件闪烁问题 protected override CreatePara ...
- markdown基础入门
一.标题 语法:# 文字 注意:1个#号代表标题1,两个代表标题2,依次类推 # 标题1 ## 标题2 ### 标题3 #### 标题4 ##### 标题5 ###### 标题6 二.加粗,斜体 语法 ...
- 基于jquery二维码生成插件qrcode
1.首先在页面中加入jquery库文件和qrcode插件. ? 1 2 <script type="text/javascript" src="jquery.js& ...
- 为什么用bower 安装bootstrap而不用npm来安装?
NPM(node package manager),通常称为node包管理器.顾名思义,它的主要功能就是管理node包,包括:安装.卸载.更新.查看.搜索.发布等. npm的背后,是基于couchdb ...