允许访问文件夹中文件的视图。

lazr.exportedfolder的Python项目详细描述


请看https://dev.launchpad.net/LazrStyleGuidehttps://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)

lazr.exportedfolder的新闻

1.0.0(2009-10-26)

  • 初始版本

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

推荐PyPI第三方库


热门话题
java楼梯的最大高度   java Jackson从1.7.1更新到2.8.6 JsonTypeInfo子类型反序列化   Spring WebApp中的java JPA异常处理   java在SwingWorker(doInBackground)中从WorkerThread调用多个方法?   java Android Studio构建到jar   java是添加多个按钮组的更有效方法   java MySQL JDBC连接池最大大小   java如何防止元素<Integer>变成元素<Object>   Java:处理大型XML文件提取数据而不编写状态自动机?   SpringBoot和React Web应用程序中CAS的java重定向问题   需要java算法方面的帮助吗   java在JDK 16中使用PowerMock   java异常错误本机方法签名   在Java Android中将JSON映射到数组/对象   如何打开一个窗口。java程序中的dat文件   java应用程序引擎+Maven+热插拔   java Moxy的getValueByXPath为除根元素以外的所有元素返回null