提供访问文件夹中文件的视图。
项目描述
有关如何在此软件包中开发的详细信息,请参阅 https://dev.launchpad.net/LazrStyleGuide 和 https://dev.launchpad.net/Hacking。
服务文件目录
LAZR Exported Folder添加了特殊视图,可用于服务特定目录下的所有文件。
ExportedFolder
这是基本实现。要导出目录,您需要子类化该视图并提供一个文件夹属性,该属性返回要公开的目录路径。
>>> import os >>> import tempfile >>> resource_dir = tempfile.mkdtemp(prefix='resources') >>> file(os.path.join(resource_dir, 'test.txt'), 'w').write('Text file') >>> file(os.path.join(resource_dir, 'image1.gif'), 'w').write( ... 'GIF file') >>> file(os.path.join(resource_dir, 'image2.png'), 'w').write( ... 'PNG file') >>> os.mkdir(os.path.join(resource_dir, 'a_dir')) >>> file(os.path.join(resource_dir, 'other.txt'), 'w').write( ... 'Other file')>>> from lazr.exportedfolder.folder import ExportedFolder >>> class MyFolder(ExportedFolder): ... folder = resource_dir
该视图提供了处理所有遍历逻辑所需的IBrowserPublisher接口。
>>> from zope.interface.verify import verifyObject >>> from zope.publisher.interfaces.browser import IBrowserPublisher >>> from zope.publisher.tests.httprequest import TestRequest>>> view = MyFolder(object(), TestRequest()) >>> verifyObject(IBrowserPublisher, view) True
视图将为其遍历的文件提供服务。
>>> view = view.publishTraverse(view.request, 'test.txt') >>> print view() Text file
它还设置了响应上的缓存控制的适当头信息。
>>> for name, value in sorted(view.request.response.getHeaders()): ... print "%s: %s" % (name, value) Cache-Control: public,max-age=86400 Content-Type: text/plain Expires: ... Last-Modified: ...
可以覆盖默认的最大年龄。
>>> view = MyFolder(object(), TestRequest()) >>> view.max_age = 1440>>> view = view.publishTraverse(view.request, 'test.txt') >>> print view() Text file>>> for name, value in sorted(view.request.response.getHeaders()): ... print "%s: %s" % (name, value) Cache-Control: public,max-age=1440 Content-Type: text/plain Expires: ... Last-Modified: ...
它接受通过任意修订标识符遍历到文件。
>>> view = MyFolder(object(), TestRequest()) >>> view = view.publishTraverse(view.request, 'rev6510') >>> view = view.publishTraverse(view.request, 'image1.gif') >>> print view() GIF file
请求目录将引发NotFound异常。
>>> view = MyFolder(object(), TestRequest()) >>> view = view.publishTraverse(view.request, 'a_dir') >>> view() Traceback (most recent call last): ... NotFound:...
默认情况下,子目录不会被导出。(下面将说明如何启用此功能)
>>> view = MyFolder(object(), TestRequest()) >>> view = view.publishTraverse(view.request, 'a_dir') >>> view = view.publishTraverse(view.request, 'other.txt') >>> view() Traceback (most recent call last): ... NotFound:...
不请求任何文件也会引发NotFound异常。
>>> view = MyFolder(object(), TestRequest()) >>> view() Traceback (most recent call last): ... NotFound:...
类似于请求不存在的文件。
>>> view = MyFolder(object(), TestRequest()) >>> view = view.publishTraverse(view.request, 'image2') >>> view() Traceback (most recent call last): ... NotFound:...
ExportedImageFolder
对于图像,通常不需要请求扩展名。有一个ExportedImageFolder子类,它将接受服务没有扩展名的图像文件。例如,请求‘image1’或‘image2’将提供正确的文件。支持的扩展名在image_extensions属性中定义。
>>> from lazr.exportedfolder.folder import ExportedImageFolder>>> class MyImageFolder(ExportedImageFolder): ... folder = resource_dir>>> view = MyImageFolder(object(), TestRequest()) >>> view.image_extensions ('.png', '.gif')>>> view = view.publishTraverse(view.request, 'image2') >>> print view() PNG file >>> print view.request.response.getHeader('Content-Type') image/png
如果存在没有扩展名的文件,则将提供该文件。
>>> file(os.path.join(resource_dir, 'image3'), 'w').write( ... 'Image without extension') >>> file(os.path.join(resource_dir, 'image3.gif'), 'w').write( ... 'Image with extension')>>> view = MyImageFolder(object(), TestRequest()) >>> view = view.publishTraverse(view.request, 'image3') >>> print view() Image without extension>>> view = MyImageFolder(object(), TestRequest()) >>> view = view.publishTraverse(view.request, 'image3.gif') >>> print view() Image with extension
导出树
默认情况下,ExportedFolder不导出包含的文件夹,但如果将export_subdirectories设置为True,它将允许遍历到子目录。
>>> os.mkdir(os.path.join(resource_dir, 'public')) >>> file(os.path.join( ... resource_dir, 'public', 'test1.txt'), 'w').write('Public File') >>> os.mkdir(os.path.join(resource_dir, 'public', 'subdir1')) >>> file(os.path.join( ... resource_dir, 'public', 'subdir1', 'test1.txt'), 'w').write( ... 'Sub file 1')>>> class MyTree(ExportedFolder): ... folder = resource_dir ... export_subdirectories = True
现在遍历到子目录中的文件将工作。
>>> view = MyTree(object(), TestRequest()) >>> view = view.publishTraverse(view.request, 'public') >>> view = view.publishTraverse(view.request, 'subdir1') >>> view = view.publishTraverse(view.request, 'test1.txt') >>> print view() Sub file 1
但遍历到子目录本身将引发NotFound异常。
>>> view = MyTree(object(), TestRequest()) >>> view = view.publishTraverse(view.request, 'public') >>> print view() Traceback (most recent call last): ... NotFound:...
尝试请求不存在的文件也将引发NotFound异常。
>>> view = MyTree(object(), TestRequest()) >>> view = view.publishTraverse(view.request, 'public') >>> view = view.publishTraverse(view.request, 'nosuchfile.txt') >>> view() Traceback (most recent call last): ... NotFound:...
遍历超出现有文件到不存在的文件也将引发NotFound异常。
>>> view = MyTree(object(), TestRequest()) >>> view = view.publishTraverse(view.request, 'public') >>> view = view.publishTraverse(view.request, 'subdir1') >>> view = view.publishTraverse(view.request, 'test1.txt') >>> view = view.publishTraverse(view.request, 'nosuchpath') >>> view() Traceback (most recent call last): ... NotFound:...
清理
>>> import shutil >>> shutil.rmtree(resource_dir)
lazr.exportedfolder的新闻
1.0.0 (2009-10-26)
初始发布