允许访问文件夹中文件的视图。
lazr.exportedfolder的Python项目详细描述
请看https://dev.launchpad.net/LazrStyleGuide和 https://dev.launchpad.net/Hacking如何在这个 包裹。
提供文件目录
lazr导出文件夹添加了可用于服务所有 特定目录下的文件。
导出文件夹
这是基本实现。要导出目录,您需要 子类化该视图并提供一个文件夹属性,该属性返回 要公开的目录。
>>> 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
该视图提供处理 所有的遍历逻辑。
>>> 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”将 提供正确的文件。支持的扩展定义在 图像扩展属性。
>>> 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_子目录设置为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:...
试图请求一个不存在的文件,也会引发一个NoDebug。
>>> view = MyTree(object(), TestRequest()) >>> view = view.publishTraverse(view.request, 'public') >>> view = view.publishTraverse(view.request, 'nosuchfile.txt') >>> view() Traceback (most recent call last): ... 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)