使用bottle进行web开发(5):Generating Content
在纯粹的 WSGI中,你的应用能返回的数据类型是十分有限的,你必须返回可迭代的字符串,你能返回字符串是因为字符串是可以迭代的,但是这导致服务器将你的内容按一字符一字符的传送,这个时候,Unicode 字符将不允许被返回了,这是肯定不行的。
Bottle 则支持了更多的数据类型,它甚至添加了一个 Content-Length 头信息,并且自动编码 Unicode 数据,下面列举了 Bottle 应用中,你可以返回的数据类型,并且简单的介绍了一下这些数据类型的数据都是怎么被 Bottle 处理的:
| 数据类型 | 介绍 |
|---|---|
| 字典(Dictionaries) | Python 内置的字典类型数据将自动被转换为 JSON 字符串,并且添加 Content-Type 为 ’application/json’ 的头信息返回至浏览器,这让我们可以很方便的建立基于 JSON 的API |
| 空字符串,False,None或者任何非真的数据 | Bottle 将为这类数据创建 ContentLength 头文件,被设置为 0 返回至浏览器 |
| Unicode 字符串 | Unicode 字符串将自动的按 Content-Type 头文件中定义的编码格式进行编码(默认为UTF8),接着按普通的字符串进行处理 |
| 字节串(Byte strings) | Bottle 返回整个字符串(而不是按字节一个一个返回),同时增加 Content-Length 头文件标示字节串长度 |
HTTPError 与HTTPResponse 实例 |
返回这些实例就像抛出异常一样,对于 HTTPError,错误将被与相关函数处理 |
| 文件对象 | 然后具有 .read() 方法的对象都被看作文件或者类似文件的对象进行处理,并传送给 WSGI 服务器框架定义wsgi.file_wrapper 回调函数,某一些WSGI服务器会使用系统优化的请求方式(Sendfile)来发送文件。 |
| 迭代器与生成品 | 你可以在你的回调函数使用 yield 或者 返回一个迭代器,只要yield的对象是字符串,Unicode 字符串,HTTPError 或者 HTTPResponse 对象就行,但是不允许使用嵌套的迭代器,需要注意的是,当 yield 的值第一次为非空是, HTTP 的状态 和 头文件将被发送到 浏览器 |
如果你返回一个 str 类子类的实例,并且带有 read() 方法,那它还是将按 字符串进行处理,因为字符串有更高一级的优先处理权。
改变默认编码
Bottle 依照 Content-Type 头文件中 charset 参数来对字符串进行编码,该头文件默认为 text/html; charset=UTF8 ,并且可以被Response.content_type 属性修改,或者直接被 Response.charset 属性修改:
from bottle import response
@route('/iso')
def get_iso():
response.charset = 'ISO-8859-15'
return u'This will be sent with ISO-8859-15 encoding.'
@route('/latin9')
def get_latin():
response.content_type = 'text/html; charset=latin9'
return u'ISO-8859-15 is also known as latin9.'
由于某些罕见的原因,Python 编码的名称可能与 HTTP 编码的名称不一致,这时你需要做两方法的工作首先设置Response.content_type 头文件,然后还需要设置 Response.charset 。
静态文件
你可以直接返回文件,但是 Bottle 推荐使用 static_file() 方法,它会自动的猜测文件的 mime-type,追加 Last-Modified 头文件,完全的自定义需要服务的文件路径,并且能处理错误(比如 404),并且它还支持 If-Modified-Since 头文件并且可以返回 304 Not Modified 响应,你还可以使用一个自定义的 mime-type 来重写 mime-type 猜测的值。
from bottle import static_file
@route('/images/:filename#.*\.png#')
def send_image(filename):
return static_file(filename, root='/path/to/image/files', mimetype = 'image/png')
@route('/static/:filename')
def send_static(filename):
return static_file(filename, root='/path/to/static/files')
如果你真的需要,你还可以以异常的形式抛出文件。
强制下载
绝大多数浏览器在知道下载的文件的MIME类型并且该文件类型被绑定到某一个应用程序时(比如PDF文件),它们都会自动的打开该文件,如果你不想这样,你可以强制的要求浏览器进行下载。
@route('/download/:filename')
def download(filename):
return static_file(filename, root='/path/to/static/files', download=filename)
使用bottle进行web开发(5):Generating Content的更多相关文章
- 使用bottle进行web开发(9):文件上传;json传递
1.文件上传 如果要完成文件上传,则需要对上文的form做一点改动,具体如下: <form action="/upload" method="post" ...
- 使用bottle进行web开发(1):hello world
为什么使用bottle?因为简单,就一个py文件,和其他模块没有依赖,3000多行代码. http://www.bottlepy.org/docs/dev/ 既然开始学习,就安装它吧. pip3 in ...
- 使用bottle进行web开发(8):get的参数传递,form里的额数据传递等
1.诸如:forum?id=1&page=5这样的,在bottle里,可以通过request.query来访问这些值,举例如下: from bottle import Bottle,run,r ...
- 使用bottle进行web开发(4):HTTPError
from bottle import error @error(404) def error404(error): return 'Nothing here, sorry' 上述代码,是对404的定义 ...
- 使用bottle进行web开发(2):http request
我们知道,http request有多个方法,比如get,post,delete,patch,put等.对用的,bottle都定义了相应的装饰器,目前定义了五个: get(),post(),put() ...
- 使用bottle进行web开发(6):Response 对象
Response的元数据(比如http的status code,headers,cookies等,都被i封装到一个叫Response的对象中,并传给浏览器. status code:status co ...
- 使用bottle进行web开发(3):静态文件的获取
静态文件(比如css啊,需要下载的各位文件等),需要通过static_file来操作,首先记得要在import中导入 @route('/static/<filename>') def se ...
- python bottle框架(WEB开发、运维开发)教程
教程目录 一:python基础(略,基础还是自己看书学吧) 二:bottle基础 python bottle web框架简介 python bottle 框架环境安装 python bottle 框架 ...
- bottle+cherrypy快速开发web服务
我目前用得最顺手的python web框架是bottle,简单方便. bottle有一个开发用的http服务器,效率不高,单线程,阻塞. 所以,得找个别的服务器来部署. 根据bottle官方的文档,发 ...
随机推荐
- [转]学习win10的bash使用ssh连接远程服务器
1. 前言 微软已经在Win10一周年更新预览版中加入了Ubuntu Bash命令支持,相当于一个小型的linux系统,本来连接远程服务器的话,要使用putty啥的,现在可以用这个直接连接,我来讲讲步 ...
- 【Python】Python内置函数dir详解
1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: 复制代码代码如下: >>> help(dir)Help on built-in function ...
- lintcode-96-链表划分
96-链表划分 给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前. 你应该保留两部分内链表节点原有的相对顺序. 样例 给定链表 1->4->3->2-&g ...
- sendto函数的坑
测试unix数据报套接字时,一个程序收,一个程序发,分别绑定自己的socket.结果在收的部分,返回的发送方的地址总是空的,但是返回的地址长度又是对的. ) { bzero(&clientad ...
- Nginx+tomcat+redis集群共享session实现负载均衡
1.nginx是一款轻量级兼备高性能的Http和反向代理服务器.所谓反向代理就是指用户发起访问请求,由代理服务器接受,然后将请求转发给正式服务器,并且将正式服务器处理完的数据返回给客户单,此时代理服务 ...
- 算法(8)Maximum Product Subarray
题目:在一个数组中找到一个子数组,让子数组的乘积最大,比如[2,3,-2,4]返回6 思路:之前自己想到的思路是对于一个int类型的数组,只要负数的个数是偶数,那么乘积肯定是全局乘就可以了,然后对于负 ...
- [ZJOI2006]物流运输 DP 最短路
---题面--- 题解: 设f[i]表示到第i天的代价,cost[i][j]表示第i天到第j天采取同一种方案的最小代价.那么转移就很明显了,直接$n^2$枚举即可. 所以问题就变成了怎么获取cost数 ...
- C&C++——库头文件及其作用
1. 一些头文件的作用::ANSI C.提供断言,assert(表达式):GCC.GTK,GNOME的基础库,提供很多有用的函数,如有数据结构操作函数.使用glib只需要包含:GCC.文件夹操作函数. ...
- 简单配置oracle11g
一.配置 Systemd file(开机可以自动oracle,也可以查看启动状态) a.定义环境变量 [oracle@ol7 ~]$ cat /etc/sysconfig/DB11G.oracledb ...
- AWS CLI command example
1.list ec2 instance-id, instance status, type, ip address, name aws ec2 describe-instances --query ' ...