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 相关文章推荐
在Django中使用Sitemap的方法讲解
Jul 22 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
对python 读取线的shp文件实例详解
Dec 22 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
python 正则表达式参数替换实例详解
Jan 17 Python
解决Python pip 自动更新升级失败的问题
Feb 21 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
如何用python爬取微博热搜数据并保存
Feb 20 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
自己做矿石收音机
2021/03/02 无线电
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
JavaScript传递变量: 值传递?引用传递?
2011/02/22 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
Python实现统计文本文件字数的方法
2017/05/05 Python
简单易懂的python环境安装教程
2017/07/13 Python
一道python走迷宫算法题
2018/01/22 Python
对Python中数组的几种使用方法总结
2018/06/28 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
2018/12/27 Python
Python实现微信消息防撤回功能的实例代码
2019/04/29 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
Django基于客户端下载文件实现方法
2020/04/21 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
详解Python IO编程
2020/07/24 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
村委会主任先进事迹
2014/01/15 职场文书
北体毕业生求职信
2014/02/28 职场文书
班级口号大全
2014/06/09 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python