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通过openpyxl生成Excel文件的方法
May 12 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
Jun 29 Python
pycharm 主题theme设置调整仿sublime的方法
May 23 Python
详解python 注释、变量、类型
Aug 10 Python
Scrapy框架使用的基本知识
Oct 21 Python
python sqlite的Row对象操作示例
Sep 11 Python
Python实现搜索算法的实例代码
Jan 02 Python
Python中sorted()排序与字母大小写的问题
Jan 14 Python
新手入门学习python Numpy基础操作
Mar 02 Python
Python实现的北京积分落户数据分析示例
Mar 27 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 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+XML 制作简单的留言本 图文教程
2009/11/02 PHP
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
php设置允许大文件上传示例代码
2014/03/10 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
JavaScript实现简单的数字倒计时
2015/05/15 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
Python遍历pandas数据方法总结
2018/02/09 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
python如何制作缩略图
2019/04/30 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
西班牙手机之家:Phone House
2018/10/18 全球购物
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
教师批评与自我批评(群众路线)
2014/10/15 职场文书
捐款感谢信
2015/01/20 职场文书
2015年法院工作总结范文
2015/04/28 职场文书
党员违纪检讨书
2015/05/05 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
大学生就业指导课心得体会
2016/01/15 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书
python之json文件转xml文件案例讲解
2021/08/07 Python