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脚本实现网卡流量监控
Feb 14 Python
Python中字典和集合学习小结
Jul 07 Python
Django进阶之CSRF的解决
Aug 01 Python
python利用ffmpeg进行录制屏幕的方法
Jan 10 Python
Python中extend和append的区别讲解
Jan 24 Python
详细介绍pandas的DataFrame的append方法使用
Jul 31 Python
Python time库基本使用方法分析
Dec 13 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
numpy库reshape用法详解
Apr 19 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
Python中使用subprocess库创建附加进程
May 11 Python
Django + Taro 前后端分离项目实现企业微信登录功能
Apr 07 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图像处理类代码分享
2012/01/19 PHP
10 个经典PHP函数
2013/10/17 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
phpstudy2020搭建站点的实现示例
2020/10/30 PHP
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
学习ExtJS fit布局使用说明
2009/10/08 Javascript
jquery统计输入文字的个数并对其进行判断
2014/01/07 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
动态加载js、css的简单实现代码
2016/05/26 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
python生成随机验证码(中文验证码)示例
2014/04/03 Python
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
Python基于SMTP协议实现发送邮件功能详解
2018/08/14 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
飞利浦美国官网:Philips美国
2020/02/28 全球购物
计算机网络专业推荐信
2013/11/24 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
实习科室评语
2015/01/04 职场文书
爱的承诺书
2015/01/20 职场文书
毕业欢送会致辞
2015/07/29 职场文书
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android