Python轻量级web框架bottle使用方法解析


Posted in Python onJune 13, 2020

Bottle是一个轻量级的Web框架,此框架只由一个 bottle.py 文件构成,不依赖任何第三方模块。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottle

app = Bottle()


@app.route('/say')
def index():
  return "Hello World"
  # return template('<b>Hello {{name}}</b>!', name="bottle")

if __name__ == '__main__':

  app.run(server="tornado",host='0.0.0.0', port=8888)

1、路由系统

路由系统是的url对应指定函数,当用户请求某个url时,就由指定函数处理当前请求,对于Bottle的路由系统可以分为一下几类:

  • 静态路由
  • 动态路由
  • 请求方法路由
  • 二级路由

1.1静态路由

@app.route("/login") # 默认为get请求
def hello():
  return """
  <form action="/login" method="post">
  Username:<input name="username" type="text" />
  Password:<input name="password" type="password" />
  <input value="Login" type="submit"/>
  </form>
  """

@app.route("/login",method="POST")
def do_login():
  username = request.forms.get("username")
  password = request.forms.get("password")
  print(username,password)
  if username and password:
    return "<p>login success</p>"
  else:
    return "<p>login failure</p>"

1.2动态路由

@app.route('/say/<name>')
def callback(name):
  return template('<b>Hello {{name}}</b>!')
 
@app.route('/say/<id:int>')
def callback(id):
  return template('<b>Hello {{id}}</b>!')
 
@app.route('/say/<name:re:[a-z]+>')
def callback(name):
  return template('<b>Hello {{name}}</b>!')
 
@app.route('/static/<path:path>')
def callback(path):
  return static_file(path, root='static')

1.3请求方法路由

@app.route('/hello/', method='POST')  # 等同于@app.post('/hello/')
def index():
  ...
 
@app.get('/hello/')  # 等同于@app.route('/hello/',method='GET')
def index():
  ...
 
@app.post('/hello/')  # 等同于@app.route('/hello/',method='POST')
def index():
  ...
 
@app.put('/hello/') # 等同于@app.route('/hello/',method='PUT')
def index():
  ...
 
@app.delete('/hello/') 
def index():
  ...

1.4二级路由

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottle

app01 = Bottle()

@app01.route('/hello/', method='GET')
def index():
  return template('<b>App01</b>!')
app01.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottle

app02 = Bottle()
@app02.route('/hello/', method='GET')
def index():
  return template('<b>App02</b>!')
app02.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottle
from bottle import static_file
app = Bottle()
 
@app.route('/hello/')
def index():
  return template('<b>Root {{name}}</b>!', name="bottle")
 
from root_dir import app01
from root_dir import app02
 
app.mount('app01', app01.app01)
app.mount('app02', app02.app02)
 
app.run(host='localhost', port=8888)

1.5静态文件映射,static_file()函数用于响应静态文件的请求

# 静态文件映射,static_file()函数用于响应静态文件 的请求
@app.route("/static/<filename:re:.*\.jpg>")
def send_image(filename):
  return static_file(filename, root=os.getcwd(), mimetype="image/jpg")

@app.route("/static/<filename:path>")  # 可匹配路径
def send_image(filename):
  return static_file(filename, root=os.getcwd(), mimetype="image/jpg")

# 强制下载
@app.route("/static/<filename:path>")  # 可匹配路径
def download(filename):
  return static_file(filename, root=os.getcwd(), download=filename)

1.6使用error()函数自定义错误页面

@app.error(404)
def error404(error):
return "我找不到目标了,我发生错误了"

1.7HTTP错误和重定向

abort()函数是生成HTTP错误的页面的一个捷径

@app.route("/restricted")
def restricted()
  abort(401,"Sorry, access denied")
# 将url重定向到其他url,可以在location中设置新的url,接着返回一个303 # redirect()函数可以帮助我们做这件事

@app.route("/wrong/url")
def wrong()
  redirect("/right/url")

其他异常

除了HTTPResponse或者HTTPError以外的其他异常,都会导致500错误,因此不会造成WSGI服务器崩溃

将bottle.app().catchall的值设为False来关闭这种行为,以便在中间件中处理异常

2.cookies

@app.route("/login", method="POST")
def do_login():
  username = request.forms.get("username")
  password = request.forms.get("password")
  print(username, password)
  if username and password:
    response.set_cookie("name",username, secret= 'some-secret-key')  # 设置cookie
    return "<p>login success</p>"
  else:
    return "<p>login failure</p>"
@app.route("/static/<filename:re:.*\.jpg>")
def send_image(filename):
  username = request.get_cookie("name", secret= 'some-secret-key')  # 获取cookie
  if username:
    return static_file(filename, root=os.getcwd(), mimetype="image/jpg")
  else:
    return "verify failed"

bottle就的 set_cookie 的默认 path 是当前路径,也就是说,在这个页面上存入的 cookie 在别的页面通常是取不到的,不熟悉这点的人几乎都要栽在这里。而且更坑的是:set_cookie 有 path 参数可以指定 path ,但 get_cookie 却没有这个 path 参数可选——也就是说,你即使设置了其它 path ,如果 get_cookie 的时候不是刚好在那个 path 下的话,也取不到……

解决方法:把所有的 cookie 都放到"/"下面,至少目前用下来感觉没问题。

注:request.query 或 request.forms 都是一个 FormDict 类型,

其特点是:当以属性方式访问数据时——如 request.query.name,返回的结果是 unicode ,当以字典试访问数据时,如 :request.query['name']或者request.query.get("name"),则返回的结果是原编码字符串

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
Oct 29 Python
从运行效率与开发效率比较Python和C++
Dec 14 Python
Python逐行读取文件中内容的简单方法
Feb 26 Python
python 通过可变参数计算n个数的乘积方法
Jun 13 Python
python中@property和property函数常见使用方法示例
Oct 21 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
python实现超级马里奥
Mar 18 Python
python安装后的目录在哪里
Jun 21 Python
Python request中文乱码问题解决方案
Sep 17 Python
python中实现词云图的示例
Dec 19 Python
Python实现我的世界小游戏源代码
Mar 02 Python
浅谈python中的多态
Jun 15 Python
PyInstaller运行原理及常用操作详解
Jun 13 #Python
Pandas缺失值2种处理方式代码实例
Jun 13 #Python
Python Django中间件使用原理及流程分析
Jun 13 #Python
Django QuerySet查询集原理及代码实例
Jun 13 #Python
Python celery原理及运行流程解析
Jun 13 #Python
基于Python实现视频的人脸融合功能
Jun 12 #Python
使用Keras实现简单线性回归模型操作
Jun 12 #Python
You might like
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
php 多文件上传的实现实例
2016/10/23 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
JS 的应用开发初探(mootools)
2009/12/19 Javascript
js继承的实现代码
2010/08/05 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
vue-router:嵌套路由的使用方法
2017/02/21 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
webpack之引入图片的实现及问题
2018/10/08 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
Python生成数字图片代码分享
2017/10/31 Python
Python贪心算法实例小结
2018/04/22 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
python训练数据时打乱训练数据与标签的两种方法小结
2018/11/08 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
keras之权重初始化方式
2020/05/21 Python
Python实现验证码识别
2020/06/15 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
Html5新标签解释及用法
2012/02/17 HTML / CSS
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
全球最大运动品牌的男装、女装和童装官方库存商:A&A Sports
2021/01/17 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
幼儿园大班教学反思
2014/02/10 职场文书
计算机求职自荐信范文
2014/04/19 职场文书
爱心捐助倡议书
2014/05/19 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
李白故里导游词
2015/02/12 职场文书
亲戚关系证明
2015/06/24 职场文书
解决 redis 无法远程连接
2022/05/15 Redis