跳转到主要内容

提供访问文件夹中文件的视图。

项目描述

有关如何在此软件包中开发的详细信息,请参阅 https://dev.launchpad.net/LazrStyleGuidehttps://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)

  • 初始发布

项目详情


由以下支持