Skip to main content

Dolmen zodb blob handlers

Project description

dolmen.blob is a layer above dolmen.file, using the ZODB blobs as a storage facility. It respects the IFile and the dolmen.file INamedFile interfaces.


In order to make sure that our BlobFile is functional, we test it against some common uses, implemented by and dolmen.file.NamedFile:

>>> from dolmen.blob import BlobFile, IBlobFile

>>> blob = BlobFile()
>>> blob.contentType
>>> blob.filename

>>> blob = BlobFile(data='mydata', filename="foo.txt")
>>> blob.filename
>>> blob.contentType

>>> blob = BlobFile(data=u'some random data', filename="foo.txt")
>>> blob.filename
'some random data'

>>> import cStringIO
>>> data = cStringIO.StringIO("mydata")
>>> blob = BlobFile(data=data)
>>> blob.getSize()

Let’s verify the implementation in depth:

>>> from dolmen.file import INamedFile
>>> from zope.interface import verify
>>> from import IFile

>>> blob = BlobFile(data='my data')
>>> verify.verifyObject(IBlobFile, blob)
>>> verify.verifyObject(INamedFile, blob)
>>> verify.verifyObject(IFile, blob)


The ZODB blobs mimic a basic Python file and implement basic methods, like read, write, readlines, seek, etc. In order to provide a very pluggable and performant way to persist the datas, dolmen.file proposes a storage mechanism, based on adapters. This idea, originally implemented in z3c.blobfile, has been enhanced to rely on multi adapters, adapting an ZODB.interfaces.IBlob and a data object.

As seen above, in the compatibility section, the dolmen.blob.BlobFile handles String, Unicode and file-like objects, out of the box.


If the storage can’t find a way to persist the data, a dolmen.blob.StorageError exception is raised:

>>> blob = BlobFile(data={'something': 1})
Traceback (most recent call last):
StorageError: An error occured during the blob storage. Check the value type (<type 'dict'>). This value should implement IFile, IString or IUnicode (see `dolmen.builtins`).

Storage implementation

The example above shows us that the Dict object is not handled by dolmen.blob, out of the box. Let’s implement a storage for this usecase:

>>> import zope.component
>>> from ZODB.interfaces import IBlob
>>> from dolmen.builtins import IDict
>>> from dolmen.blob import IFileStorage

>>> def store_dict(blob, dictionnary):
...     dict_repr = repr(dictionnary.items())
...     fp ='w')
...     fp.write(dict_repr)
...     fp.close()
...     return True

>>> zope.component.provideAdapter(
...    store_dict, adapts=(IBlob, IDict), provides=IFileStorage)

>>> blob = BlobFile(data={'something': 1})
"[('something', 1)]"


Filesystem access

In some cases, it’s useful to be able to be able to get the location of the physical blob file on the filesystem. This is possible through the attribute physical_path. However, this attribute is available only when the file has been persisted and the transaction commited:

>>> import transaction
>>> root = getRootFolder()
>>> root['myblob'] = BlobFile(data='my data', filename="data.txt")

The transaction has not been commited, we try to access the attribute:

>>> myblob = root['myblob']
>>> print myblob.physical_path

We now commit the transaction and retry:

>>> transaction.commit()
>>> print myblob.physical_path

Browser access

As an dolmen.file.INamedFile, the BlobFile can bee accessed by the browser, using a “file_publish” view:

>>> from zope.component import getMultiAdapter
>>> from zope.publisher.browser import TestRequest

>>> request = TestRequest()
>>> view = getMultiAdapter((myblob, request), name='file_publish')
>>> view
<dolmen.file.access.FilePublisher object at ...>

>>> view.update()
>>> for key, value in view.response.getHeaders(): print key, repr(value)
X-Powered-By 'Zope (, Python ('
Content-Length '7'
Content-Type 'text/plain'
Content-Disposition 'attachment; filename="data.txt"'

>>> view.render()
'my data'


The persistency of the data can be handled, in complex object, by a FileField using a BlobProperty:

>>> from persistent import Persistent
>>> from dolmen.file import FileField
>>> from dolmen.blob import BlobProperty
>>> from zope.interface import Interface, implements

>>> class IContent(Interface):
...     binary = FileField(title=u"Binary data")

>>> class MyContent(Persistent):
...     implements(IContent)
...     binary = BlobProperty(IContent['binary'])

>>> root['mammoth'] = MyContent()
>>> manfred = root['mammoth']
>>> manfred.binary = 'Foobar'
>>> manfred.binary
<dolmen.blob.file.BlobFile object at ...>

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dolmen.blob-0.1.tar.gz (6.4 kB view hashes)

Uploaded source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page