bottle的几个小坑
距离我在《web.py应用工具库:webpyext》里说要换用bottle,已经过去快两个月了……事实上在那之前我已经開始着手在换了。眼下那个用于 Backbone.js 介绍的样例程序已经完毕更换,其他一些原来基于web.py的应用也在逐步重写中。期间各种小坑不断,还好至今还没有碰到什么大坑……只是目測应该也不会有大坑。
unicode
作为非英文应用的开发人员,unicode是一个绕只是去的坑。 web.py 对此是不作处理的,全都按原编码方式处理。 bottle 则作了一个有点奇怪的处理:
request.query 或 request.forms 都是一个 FormDict 类型,其特点是:当以属性方式訪问数据时——如 request.query.foo,返回的结果是 unicode ,当以字典试訪问数据时——如 request.query['foo'],则返回的结果是原编码字符串。混合使用的时候,一不小心就会出问题……
比方大部分时候都用属性方式,可是某个数据须要有特定默认值的时候,就会习惯性地用字典方式操作: request.query.get("foo", "bar") ,这时就easy出编码错误。这样的情况应该使用 request.query.getunicode() 函数。
更彻底的方式是用 args=request.query.decode("utf-8") 然后 args.foo 或 args["foo"] 就都能够返回 unicode 了。
至于在实际应用中要用哪种方式来处理,就自己看情况选择了。
cookies
bottle 在这点上比 web.py 要坑,问题主要是出在 path 上。
web.py 的 setcookie 函数參数选择非常少,比方 path 就没有,默认仅仅能存放于"/",尽管这算是一个小小的限制,但使用中基本不会有什么问题。
可是bottle就坑了,它的 set_cookie 的默认 path 是当前路径,也就是说,在这个页面上存入的 cookie 在别的页面一般是取不到的,不熟悉这点的人差点儿都要栽在这里。
并且更坑的一点是: set_cookie 有 path 參数能够指定 path ,可是 get_cookie 却可耻地没有这个 path 參数可选——也就是说,你即使设置了其他 path ,假设 get_cookie 的时候不是刚好在那个 path 下的话,也取不到……
这个……反正我如今能用的办法就是跟 web.py 里一样,把全部的 cookie 都放到"/"以下,至少眼下用下来感觉没问题。
除了这个坑以外,相比 web.py 的 cookie , bottle 另一点不算不足但有时不太方便的地方:
web.py 的 cookie 能够存放不论什么可持久化的数据,比方 dict/list 。可是 bottle 的 cookie 似乎仅仅能放字符串,我试过放 list 出错。
当然这不是什么大问题,用一个 json.dumps/json.loads 就可以解决。
bottle的几个小坑的更多相关文章
- mciSendString 的两个小坑
刚刚修正了自己用的小闹钟的代码. 坑1:REPEAT 选项的作用范围 原来用得好好的,之后选择 .wav 文件,居然不出声音了…… 诶,MCI 肯定支持 .wav 的啊…… 仔细想想,我以前都是选 . ...
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...
- C#中的Infinity有个小坑
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的 ...
- 使用EMMET中的小坑
使用EMMET写HTML的时候,是一个非常爽的事情.但是今天我使用时,发现一个小坑.以前倒也没有注意,不过需要非常的小心. form[action="/process" metho ...
- 关于CSS3中transform变换的小坑
2017年6月30日15:05:46 今天在写一个demo的时候,发现CSS3中transform变换的一个特性. 首先,我先描述一下我发现的情况(问题再现): <div class=" ...
- Vue中应用CORS实现AJAX跨域,及它在 form data 和 request payload 的小坑处理
基本概念部分(一):理解CORS 说道Vue的跨域AJAX,我想先梳理一遍CORS跨域,"跨域资源共享"(Cross-origin resource sharing),它是一个W3 ...
- go的变量redeclare的问题,golang的一个小坑
go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int 然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会 ...
- MySQL中字段类型为timestamp的小坑
之前遇到过一个MySQL的字段为timestamp类型的小坑. MySQL中一个字段存储时间类型数据的时候,该字段的类型如果为timestamp类型的话,最多只能存储到2038-01-19 11:14 ...
- mysql url 连接配置的一个小坑。 工作中不会遇到。 学习的时候会
<property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> & ...
随机推荐
- 被readLine()折腾了一把
虽然写IO方面的程序不多,但BufferedReader/BufferedInputStream倒是用过好几次的,原因是: 它有一个很特别的方法:readLine(),使用起来特别方便,每次读回来的都 ...
- 汽车加油行驶(cogs 737)
«问题描述:给定一个N*N 的方形网格,设其左上角为起点◎,坐标为(1,1),X 轴向右为正,Y轴向下为正,每个方格边长为1,如图所示.一辆汽车从起点◎出发驶向右下角终点▲,其坐标为(N,N).在若干 ...
- 【CF1073B】Vasya and Books(模拟)
题意:给你一个栈里书的编号,每次能捞出栈顶的一本书,每次询问捞出某本编号的书需要捞几次 n<=2e5 思路: #include<cstdio> #include<cstring ...
- 冬训 day2
模拟枚举... A - New Year and Buggy Bot(http://codeforces.com/problemset/problem/908/B) 暴力枚举即可,但是直接手动暴力会非 ...
- [Json] 1 - 数据格式(转)
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易 ...
- django+vue+nginx生产环境部署配置
部署环境: 1. linux redhat 7.1 2.python 3.6.3 3. vue 4. nginx 5. gunicorn 6. supervisord 安装: 一. 基础环境安装 1. ...
- [SaltStack] salt-master启动流程
SaltStack源码阅读 做salt有一段时间了, 一直没从源码层面去理解, 好吧, 开始读读源码 -_- 那就从salt-master的启动开始吧. 启动salt-master方法: /etc/i ...
- springboot 邮件
<!-- 邮件end --><dependency> <groupId>org.springframework.boot</groupId> <a ...
- Lotus Notes Error: your mail file cannot be located. use file location manage location to ensure that your mail file is specified correctly
在notes客户端中,当我们切换到另一个ID的时候,通过程序发送邮件,会报错:
- Day 20 Object_oriented_programing(摘)
面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux ...