Skip to content

Instantly share code, notes, and snippets.

@cheeming
Created November 21, 2011 11:00
Show Gist options
  • Save cheeming/1382323 to your computer and use it in GitHub Desktop.
Save cheeming/1382323 to your computer and use it in GitHub Desktop.
drop in replacement for mongoengine's GridFSStorage
# refs: http://stackoverflow.com/questions/5041996/django-with-pluggable-mongodb-storage-troubles
from django.conf import settings
from django.core.files.storage import Storage
from gridfs import GridFS
from pymongo import Connection
import urlparse
class GridFSStorage(Storage):
def __init__(self, host=None, port=None, db_name=None, base_url=None):
for s in ('host', 'port', 'db_name'):
name = 'GRIDFS_' + s.upper()
if hasattr(settings, name):
setattr(self, s, getattr(settings, name))
for s, v in zip(('host', 'port', 'db_name'), (host, port, db_name)):
if v:
setattr(self, s, v)
self.db = Connection(host=self.host, port=self.port)[self.db_name]
self.fs = GridFS(self.db)
self.base_url = base_url or settings.GRIDFS_BASE_URL
def _save(self, name, content):
self.fs.put(content, filename=name)
return name
def _open(self, name, *args, **kwars):
return self.fs.get_last_version(filename=name)
def delete(self, name):
oid = self.fs.get_last_version(filename=name)._id
self.fs.delete(oid)
def exists(self, name):
return self.fs.exists({'filename': name})
def size(self, name):
return self.fs.get_last_version(filename=name).length
def url(self, name):
if self.base_url is None:
raise ValueError("This file is not accessible via a URL.")
return urlparse.urljoin(self.base_url, name).replace('\\', '/')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment