Bottle是一个快速、简洁、轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块。
Bottle框架的基本使用
from bottle import template, Bottle #去bottle里引入Bottle root = Bottle() #通过Bottle类实例化创建一个类的对象root @root.route('/hello/') #index函数被装饰器装饰了,hello是url对应了index函数 def index(): return "欢迎西西" root.run(host='localhost', port=8080) #select运行起来
访问:http://localhost:8080/hello/
返回:欢迎西西
一.Bottle框架大致可以分为以下部分:
1.路由系统:将不同请求交由指定函数处理
路由系统是的url对应指定函数,当用户请求某个url时,就由指定函数处理当前请求,对于Bottle的路由系统可以分为一下几类:
(1)静态路由:
from bottle import template, Bottle #去bottle里引入Bottle root = Bottle() #通过Bottle类实例化创建一个类的对象root @root.route('/hello/') #index函数被装饰器装饰了,hello是url对应了index函数 def index(): return template('<b>你好 {{name}}</b>!',name="西西") root.run(host='localhost', port=8080) #select运行起来
访问:http://localhost:8080/hello/
返回:你好 西西!
(2)动态路由
<1>
@root.route('/wiki/<pagename>') def callback(pagename): ...
<2>
@root.route('/object/<id:int>') def callback(id): ...
<3>
@root.route('/show/<name:re:[a-z]+>') def callback(name): ...
<4>获取静态文件
from bottle import template, Bottle,static_file #去bottle里引入static_file静态文件 root = Bottle() #通过Bottle类实例化创建一个类的对象root @root.route('/static/<path:path>') #访问static/加静态文件名字 def callback(path): return static_file(path, root='static') root.run(host='localhost', port=8080) #select运行起来
访问:http://localhost:8080/static/commons.css
返回:body {
background-color: red;
}
(3)请求方法路由
<1>POST
from bottle import template, Bottle,static_file #去bottle里引入static_file静态文件 import bottle #默认情况下去目录:['./', './views/']中寻找模板文件 index.html bottle.TEMPLATE_PATH.append('./templates/') #配置在bottle.TEMPLATE_PATH中就去templates中去找index.html root = Bottle() #通过Bottle类实例化创建一个类的对象root @root.route('/login/',method="POST") #POST方式访问 def login(): return template('login.html') root.run(host='localhost', port=8080) #select运行起来
<2>GET
from bottle import template, Bottle,static_file #去bottle里引入static_file静态文件 import bottle #默认情况下去目录:['./', './views/']中寻找模板文件 index.html bottle.TEMPLATE_PATH.append('./templates/') #配置在bottle.TEMPLATE_PATH中就去templates中去找index.html root = Bottle() #通过Bottle类实例化创建一个类的对象root @root.route('/login/',method="GET") #GET方式访问 def login(): return template('login.html') root.run(host='localhost', port=8080) #select运行起来
(4)二级路由
2.模板系统:将模板中的特殊语法渲染成字符串
视图(模版渲染)
-获取用户内容 request
-数据库操作
-文件操作
-返回给用户内容return ""
-模版引擎渲染
(1)引入内置模板系统
<1>bottle_kj\templates\index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 西西 </body> </html>
<2>执行
from bottle import template, Bottle,static_file #去bottle里引入static_file静态文件 import bottle #默认情况下去目录:['./', './views/']中寻找模板文件 index.html bottle.TEMPLATE_PATH.append('./templates/') #配置在bottle.TEMPLATE_PATH中就去templates中去找index.html root = Bottle() #通过Bottle类实例化创建一个类的对象root @root.route('/hello/') #访问static/加静态文件名字 def callback(): return template('index.html') root.run(host='localhost', port=8080) #select运行起来
访问:http://localhost:8080/hello/
返回:西西
(2)渲染语法
<1>单值
{{name}}
<2>单行Python代码
<ul> % s1 = "hello" {{s1}} </ul>
<3>Python代码快
<4>Python、Html混合
<ul> % if True: <span>{{name}}</span> % end % for item in name: <li>{{item}}</li> % end </ul>
(3)函数
<1>include导入其他模版文件
bottle_kj\templates\tpl.html
<h1>{{title}}</h1>
bottle_kj\templates\index.html
<body> <!--把参数title="西西"传到tpl.html进行渲染--> % include('tpl.html',title="西西") </body>
<2>rebase模版继承
<3>defined(name)检查当前变量是否已经被定义,已定义True,未定义False
<4>get(name, default=None)获取某个变量的值,不存在时可设置默认值
<5>setdefault(name, default)如果变量不存在时,为变量设置默认值
<6>自定义函数
1)bottle_kj\templates\index.html
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <h1>自定义函数</h1> {{ xixi() }} <!--执行bottle_kj\1.py里的custom函数--> </body> </html>
2)bottle_kj\1.py
from bottle import template, Bottle,static_file,request,redirect #去bottle里引入request import bottle #默认情况下去目录:['./', './views/']中寻找模板文件 index.html bottle.TEMPLATE_PATH.append('./templates/') #配置在bottle.TEMPLATE_PATH中就去templates中去找index.html root = Bottle() #通过Bottle类实例化创建一个类的对象root def custom(): return '123456' @root.route('/index/', method=['POST', 'GET']) def index(): user_list = [ {'id':1,'name':'东东','age':18}, {'id': 1, 'name': '南南', 'age': 18}, ] return template('index.html',name='xixi',xixi=custom) root.run(host='localhost', port=8080) #select运行起来
3.公共组件:用于提供处理请求相关的信息
由于Web框架就是用来接收用户请求->处理用户请求->响应相关内容,对于具体如何处理用户请求,开发人员根据用户请求来进行处理,而对于接收用户请求和相应相关的内容均交给框架本身来处理,其处理完成之后将产出交给开发人员和用户。
接收用户请求:当框架接收到用户请求之后,将请求信息封装在Bottle的request中,以供开发人员使用
响应相关内容:当开发人员的代码处理完用户请求之后,会将其执行内容相应给用户,相应的内容会封装在Bottle的response中,然后再由框架将内容返回给用户
所以,公共组件本质其实就是为开发人员提供接口,使其能够获取用户信息并配置响应内容
(1)request
Bottle中的request其实是一个LocalReqeust对象,其中封装了用户请求的相关信息:
<1>请求头信息:request.headers
<2>get请求信息request.query
<3>post请求信息:request.forms
<4>上传文件信息:request.files
<5>get和post请求信息:request.params
<6>get请求信息:request.GET
<7>post和上传信息:request.POST
<8>cookie信息:request.cookies
<9>环境相关相关:request.environ
(2)response
4.服务:对于Bottle框架其本身未实现类似于Tornado自己基于socket实现Web服务,所以必须依赖WSGI,默认Bottle已经实现并且支持的WSGI有