跳转到主要内容

Dolmen 缩略图库

项目描述

dolmen.thumbnailer 是一个专注于缩略图生成的包。使用 dolmen.storage 机制,它允许插件化和灵活的缩略图存储。

缩略图生成器

缩略图生成器是负责实际缩放图像的组件。该组件由 IThumbnailer 接口定义。

>>> from dolmen.thumbnailer import IThumbnailer
>>> print IThumbnailer['scale'].__doc__
Returns a StringIO that is a data representation of an image,
scaled down to the given size.

默认情况下,提供了一个 IThumbnailer 实现作为适配器。为了测试它,我们需要一个模型和一个图像。该模型将作为适配的基础。

>>> fd = open(IMAGE_PATH, 'r')
>>> data = fd.read()
>>> fd.close()

>>> class BasicContent(object):
...   pass
>>> mycontext = BasicContent()

>>> thumbnailer = IThumbnailer(mycontext)
>>> thumbnailer
<dolmen.thumbnailer.components.ScaleThumbnailer object at ...>

我们现在可以测试缩放方法。根据 IThumbnailer 接口规定,此方法需要以 PIL Image 的形式提供的数据和缩放(一个包含宽度和高度的元组)。

>>> from PIL import Image
>>> from cStringIO import StringIO

>>> image = Image.open(StringIO(data))
>>> scale = thumbnailer.scale(image, (100, 100))
>>> scale
<cStringIO.StringO object at ...>

>>> Image.open(scale).size
(100, 100)

缩放方法返回一个 cStringIO.StringIO ,它可以用于重新创建 PIL.Image 或以二进制字符串的形式保存到对象中。

IThumbnailer 实现不会修改原始图像。

>>> image.size
(280, 280)

缩略图生成器为您处理一些基本错误。

>>> thumbnailer.scale(None, (100, 100))
Traceback (most recent call last):
...
TypeError: Scaling can only occur using a PIL Image

>>> thumbnailer.scale(image, None)
Traceback (most recent call last):
...
ValueError: Size must be a (width, height) tuple

缩小器

Miniaturizer是负责缩略图策略的组件。它处理名称和大小,使用文件包装器作为存储类,并提供一组方法来管理缩略图的生成、检索和删除。

默认策略

默认策略定义在由Miniaturizer组件实现的接口IImageMiniaturizer中。让我们快速了解一下。

>>> from dolmen.thumbnailer import IImageMiniaturizer

>>> print IImageMiniaturizer['scales'].default
{'large': (700, 700), 'mini': (250, 250), 'small': (128, 128), 'preview': (400, 400), 'thumb': (150, 150)}

>>> print IImageMiniaturizer['factory'].default
<class 'dolmen.file.file.NamedFile'>

存储和适配器

默认情况下,dolmen.thumbnailer提供了一种作为适配器的IImageMiniaturizer实现。虽然它使用默认的比例和工厂,但它查询一个dolmen.storage.IDelegatedStorage组件来进行存储。这个存储是一个名为‘thumbnail’的dolmen.storage.AnnotationStorage,以便将缩略图存储在对象注解中。

这意味着,我们需要一个IAttributeAnnotatable对象。

>>> miniaturizer = IImageMiniaturizer(mycontext)
Traceback (most recent call last):
...
TypeError: ('Could not adapt', <BasicContent object at ...>, <InterfaceClass dolmen.thumbnailer.interfaces.IImageMiniaturizer>)

>>> from zope.annotation import IAttributeAnnotatable
>>> from zope.interface import alsoProvides

>>> alsoProvides(mycontext, IAttributeAnnotatable)
>>> miniaturizer = IImageMiniaturizer(mycontext)
>>> miniaturizer
<dolmen.thumbnailer.components.Miniaturizer object at ...>

现在我们得到了一个Miniaturizer对象。我们可以验证其与描述它的接口的一致性。

>>> from zope.interface import verify
>>> verify.verifyObject(IImageMiniaturizer, miniaturizer)
True

>>> miniaturizer.storage
<dolmen.thumbnailer.components.ThumbnailStorage object at ...>

>>> from dolmen.storage import IDelegatedStorage
>>> IDelegatedStorage.providedBy(miniaturizer.storage)
True

生成

Miniaturizer假设您的数据存储在对象的字段上。该组件提供的方法将使用字段名来触发其操作。

让我们向我们的内容对象添加一个图像属性

>>> from dolmen.file import file
>>> mycontext.image = file.NamedFile(data=data)
>>> mycontext.image
<dolmen.file.file.NamedFile object at ...>

我们的图像保存在我们的对象中,在名为‘image’的属性中。让我们触发缩略图生成

>>> miniaturizer.generate(fieldname="image")
True

返回值是一个表示生成成功与否的布尔值。让我们看一下生成后的存储

>>> list(miniaturizer.storage.keys())
['image.large', 'image.mini', 'image.preview', 'image.small', 'image.thumb']

一些错误由您处理

>>> miniaturizer.generate(fieldname="nonexisting")
False

>>> miniaturizer.generate(fieldname="__class__")
Traceback (most recent call last):
...
IOError: cannot identify image file

检索

可以使用缩略图名称和字段名轻松检索缩略图

>>> scale = miniaturizer.retrieve('mini', fieldname="image")
>>> scale
<dolmen.file.file.NamedFile object at ...>

正如我们所看到的,缩略图数据被封装在一个dolmen.file.file.NamedFile对象中,这是默认策略中定义的工厂

>>> isinstance(scale, IImageMiniaturizer['factory'].default)
True

Miniaturizer可以使用“fieldname.scalename”键获取缩略图

>>> print miniaturizer['image.mini']
<dolmen.file.file.NamedFile object at ...>

>>> print miniaturizer.get('image.small')
<dolmen.file.file.NamedFile object at ...>

>>> print miniaturizer.get('image.nonexistance')
None
>>> print miniaturizer.get('image.nonexistance', 'nothing !')
nothing !

像往常一样,一些错误情况由您处理

>>> print miniaturizer.retrieve('manfred', fieldname="image")
None
>>> print miniaturizer.retrieve('manfred', fieldname="not there")
None

删除

删除操作将使用字段名来删除为给定字段生成的所有缩略图

>>> miniaturizer.delete(fieldname="image")
>>> list(miniaturizer.storage.keys())
[]

访问和安全

缩略图已生成并存储。逻辑上,我们现在想要发布缩略图,以便可以通过URL访问它们。《dolmen.thumbnailer》提供了一个基于《dolmen.file.access.FilePublisher》的遍历器

>>> from zope.component import getMultiAdapter
>>> from zope.publisher.browser import TestRequest
>>> from zope.traversing.interfaces import ITraversable

>>> miniaturizer.generate(fieldname="image")
True

>>> request = TestRequest()
>>> traverser = getMultiAdapter((mycontext, request),
...                             ITraversable, name='thumbnail')

用于检查数据可用性的基本权限是《zope.View》。我们设置两个主体来测试这一点。‘jason’是一个没有权限的登录成员,而‘judith’授予了《zope.View》权限

>>> import zope.security.management as security
>>> from zope.security.testing import Principal, Participation

>>> judith = Principal('zope.judith', 'Judith')
>>> jason = Principal('zope.jason', 'Jason')

我们创建交互并尝试遍历我们的缩略图

>>> security.newInteraction(Participation(jason))
>>> traverser.traverse('image.small')
Traceback (most recent call last):
...
Unauthorized: image.small
>>> security.endInteraction()

失败了。引发了未经授权的错误。我们现在用Judith试一试

>>> security.newInteraction(Participation(judith))
>>> traverser.traverse('image.small')
<dolmen.file.access.FilePublisher object at ...>
>>> security.endInteraction()

我们的缩略图返回了,封装在一个《FilePublisher》视图中,它已经准备好渲染(有关更多信息,请参阅《dolmen.file》访问文档)。

变更日志

0.3 (2010-02-27)

  • 清理了依赖关系。我们不再有zope.app依赖关系。

  • 我们现在使用dolmen.file.file.File作为缩略图的基础文件。

0.2.3 (2010-02-19)

  • 将PIL版本更正为1.1.7

0.2.2 (2010-02-19)

  • 更新依赖:PILwoTK更新为PIL。

0.2.1 (2009-10-25)

  • 更新到最新版本的《dolmen.field》。

0.2 (2009-10-23)

  • 现在,如果工厂实现了《dolmen.file.INamedFile》,缩略图可以命名。

  • 纠正了一个问题,即指定的mimeType不是一个有效的mimeType。

0.1 (2009-10-21)

  • 初始发布

项目详情


下载文件

为您的平台下载文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分布

dolmen.thumbnailer-0.3.tar.gz (17.5 kB 查看散列)

上传于

支持者