用于从文件描述符构造响应的库
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
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