使用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)
时间: 2024-08-09 12:50:45

使用bottle进行web开发(5):Generating Content的相关文章

使用bottle进行web开发(1):hello world

为什么使用bottle?因为简单,就一个py文件,和其他模块没有依赖,3000多行代码. http://www.bottlepy.org/docs/dev/ 既然开始学习,就安装它吧. pip3 install bottle ok 第一个代码: from bottle import route,run,template @route('/hello/<name>') def index(name): return template('<b>Hello {{name}}</b&

使用bottle进行web开发(4):HTTPError

from bottle import error @error(404) def error404(error): return 'Nothing here, sorry' 上述代码,是对404的定义,这里注意,有一个HTTPError, HTTPError uses a predefined HTML template to build the body of the response. Instead of using HTTPError you can use response with

《Python3 bottle Web开发系列教程》

<Python3 bottle Web开发系列教程——前言> http://blog.91duofanli.com/opensource/%E3%80%8APython3+bottle+Web%E5%BC%80%E5%8F%91%E7%B3%BB%E5%88%97%E6%95%99%E7%A8%8B%E2%80%94%E2%80%94%E5%89%8D%E8%A8%80%E3%80%8B bottle web开发环境搭建 http://blog.91duofanli.com/opensourc

【Python】Python用Bottle轻量级框架进行Web开发

当前Python Web开发中的框架算Django最为流行了,但是本文介绍的是一个较为轻量级的Web框架:Bottle框架.理论性的东西就不讲了,直接上实例代码. 1.问题描述 最近做一个系统的后台开发,用的就是Python+Bottle进行的web后台开发.给前台提供一个接口,通过前台调用接口时的参数,提供Json数据格式的数据. 2.环境准备 我用的是Linux环境,python 2.7.x版本的python.使用Bottle之前需要pip安装bottle,输入命令:sudo pip ins

【Python】Bottle框架下Python Web开发的跨域访问

上一篇文章中介绍了Python应用Bottle轻量级框架进行Web开发,这次介绍Bottle框架下的跨域访问的问题. 当前台跨域访问时,会无法从后台得到数据,也就是说跨域访问失败. 解决办法如下: 在程序中定义一个函数代码如下: #!/usr/bin/python # -*- conding:utf-8 -*- from bottle import * #decorator def allow_cross_domain(fn): def _enable_cors(*args, **kwargs)

python bottle框架(WEB开发、运维开发)教程

教程目录 一:python基础(略,基础还是自己看书学吧) 二:bottle基础 python bottle web框架简介 python bottle 框架环境安装 python bottle 框架基础教程:路由(url定义) python bottle 框架基础教程:HTTP 请求方法 python bottle 框架基础教程:模板使用 python bottle 框架基础教程:模板语法 python bottle 框架基础教程:模板继承 python bottle 框架基础教程:静态资源

Java Web开发中MVC设计模式简介

一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但我们需要编写大型的web工程的话,我们现有的编写模式会造成web应用的可扩展性较差,而且一但出现问题不能准确的定位出问题出在哪里. Java是一门应用设计模式比较广泛的语言.目前主流提出的23种设计模式均可在Java语言编写的程序中所应用.目前

web开发中比较常用的html标签

作为一名web开发人员,总结了一下经常用到的html标签,如下:<html> <head> <!--meta头标签 表示页面三秒后跳转到新浪页面--> <meta charset="utf-8" http-equiv="refresh" content="3;url=http://www.sina.com"/> <title></title> </head> &l

Java Web开发模式

一 Java Web开发模式的变迁 1 最初的Java web服务器端编程技术是Servlet,利用Servlet就可以开发出一个Web应用程序. 2 为了解决Servlet缺陷,SUN推出了JSP技术.但是开发人员又走向了另一个极端就是完全放弃了Servlet. 在JSP页面混合使用HTML标记和java代码编写的脚本元素标记来开发Web程序.采用这种方法虽然可以编写JSP页面变得简单,直观,然而,他只适合于业务流程简单,系统规模较小的应用系统. 如果系统较大的话,就会出现两个严重的缺点: 1