用于从文件描述符构造响应的库

bottle-fdsend的Python项目详细描述


====
bottle fdsend
====


这个包实现了从文件句柄构造bottle的"httpresponse"对象的功能。与"bottle.static_file()"函数不同,此包中的
函数允许提供在内存中构造的文件,或
从压缩存档解压缩到内存中的文件。


pip install bottle fdsend


easy_install bottle fdsend


基本用法
==


我们大部分时间将使用的函数是"fdsend.send_file()`
函数。最简单的是,我们只需将一个类似文件的对象传递给这个
函数,它就会返回一个``bottle.httpresponse``对象。

例如:


from stringio import stringio
from fdsend import send戋file

def my戋request戋handler():
s=stringio('foo')
返回send_文件

,因为我们使用的是内存文件而不是物理文件,但是,如果不提供有关该文件的其他
元数据,则不会设置任何公共响应头。为了设置内容类型、内容长度和类似的头,我们需要传递几个可选参数。

我们必须把它退了,才能让瓶子端上来。我们还需要记住,
返回的响应对象是一个全新的对象,我们对
``bottle.response``所做的任何事情都不会反映在它上面。如果需要设置额外的
头等等,则必须在返回的响应对象上设置,而不是在
global``bottle.response``对象上设置。


content type
====

content type头有两种设置方法。一种是传递ctype
参数::

def my_request_handler():

return send_file(s,ctype='text/html')


另一种方法是指定扩展名为

def my_request_handler():

return send_file(s,filename='foo.html')

/>类型是根据文件扩展名自动计算的。如果文件的mime类型(内容类型)以"test/"开头(例如,"text/html"、
"text/plain"等等),则字符集将附加到内容类型头。

例如,``send_file(s,filename='foo.html')``将生成一个内容类型
头,其外观如下:

内容类型:text/html;charset=utf-8

默认为"utf-8"字符集。如果数据使用不同的
字符集,则需要显式指定它。用法:

def my_request_handler():

取决于文件扩展名,而
是内容编码头。这适用于压缩文件。例如:

def my_request_handler():

return send_file(s,filename='foo.html.gz')


以上代码段生成以下头:

content type:text/html;charset=utf-8
content encoding:gzip

content encodi无法手动设置ng头,但可以通过手动传递"ctype"参数来省略它。



提前知道文件的大小,并告诉"send_file()"应该使用什么大小。这是通过使用名为"size"的参数来完成的。


def my_request_handler():

return send_file(s,size=2000)


s

第一个报头告诉客户端有效负载的大小,第二个报头宣布我们可以执行字节服务。当浏览器想要检索部分文件时(例如,继续下载、分阶段加载文件,如视频播放器、pdf扩展等),字节服务特别有用。

`` send_file()``处理它。但是,我们确实需要知道文件的总大小并传递它。

et,必须传递timestamp
参数。时间戳必须以Unix纪元后的秒为单位。用法:

def my_request_handler():

return send_file(s,timestamp=1429458831)


上述时间戳将生成以下最后修改的头:


last modified:sun,2015年4月19日15:53:51 GMT

_ file()``当客户端包含一个有效的
`` if modified since``请求头时,将自动返回一个

content disposition
======


当content disposition header设置为"attachment"值时,大多数现代浏览器将我让用户下载文件(例如,通过打开下载
对话框),而不是试图在浏览器
窗口中显示内容。要设置此头,我们需要同时传递filename和
``attachment``参数::


def my_request_handler():

return send_file(s,filename='foo.html',attachment=true)

byte-serving wrappers
==控制如何从
字节服务中的类文件对象返回范围。

我们可以使用的最简单的包装器是瓶子本身的"瓶子"文件范围"生成器函数。这个包装器允许我们遍历所需的范围
,并以块(默认为1MB)的形式返回文件数据。

虽然这在大多数情况下都有效,但对于某些类型的文件(如
对象)则不起作用,例如使用deflate compression的zip文件内容的文件句柄
,它不允许对它们调用"seek()"。(更不用说,
"瓶子文件范围"不是公共api,因此需要进行
更改)。

一个是
``fdsend.rangewrapper.rangewrapper``生成器函数,另一个是
``fdsend.rangewrapper.rangewrapper``类。

``.

"range wrapper"有点不同,它返回一个类似文件的对象,该对象有自己的"read()"方法,该方法仅限于请求的范围。

两者之间的主要区别在于是否使用了"wsgi.file_wrapper"功能
。此功能要求传递一个类似文件的对象,以便使用


包装必须是可调用的
(函数、类等),并且必须接受以下位置参数:

-文件句柄
-偏移量(从文件开始以字节为单位)
-长度(以字节为单位的范围大小)


返回值必须是有效的wsgi响应体(string,iterable,
类似文件的对象)。


_字节服务:https://en.wikipedia.org/wiki/byte_serving
。_问题跟踪:https://github.com/outernet-project/bottle-fdsend/issues

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Selenium运行ChromeDriver而不修改路径   java软件包sun。网www.protocol。https不可见   java AEM中的哪个类实现了javax。servlet。请求调度器接口?   在java/scala中读取zip或7z文件时的性能问题   java将一个文件写入另一个二进制文件   java在类本身中创建实例   Java中C#Action()委托的等价物?   java如何在任何类中使用@Context或类似工具获取ServletRequest?   重构(java)应该/如何重构此代码?   hibernate中的java TransientObject异常   gwt使用Java在CouchDB 2.0 fauxton中创建文档   xml错误Java Jersey:NotAuthorizedException:HTTP 401未经授权   java heroku错误:无法找到或加载主类   java从CAS 5.0检索已发布的属性。Spring Security中的x 3.2.5