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)
初始发布