système de stockage personnalisé pour GridFS (MongoDB)?
Question
Quelqu'un peut-il me pointer vers des projets / applications django qui offrent un système de stockage personnalisé embrochable je peux utiliser GridFS avec Django pour stocker les téléchargements de fichiers?
Je l'ai trouvé django-MongoDB, mais il ne semble pas soutenir GridFS, ni django-mémoires.
Je prévois de lancer MySQL pour la base de données requrements normale et utiliser uniquement MongoDB pour le stockage de fichiers afin d'être clair, je ne veux pas utiliser MongoDB comme ma base de données principale.
La solution
Je travaille sur PyMongo, le pilote MongoDB Python, et ne l'ai pas entendu parler d'un projet pour fournir un stockage personnalisé pour Django en utilisant GridFS. Cela ressemble à ce ne serait pas très difficile d'écrire sur le dessus de PyMongo: pourrait probablement être une traduction directe de la GridFS API sur
Autres conseils
J'ai récemment mis à exécution les GridFS soutien Mongoengine que vous pourriez aimer à la caisse. Cela comprend un back-end de stockage Django que vous pouvez brancher directement dans vos projets et à utiliser avec ImageField etc. J'utilise ces technologies dans la production et tient jusqu'à ce jour grand.
django-mongodb-moteur pourrait être intéressant de regarder car elle permet vous de le faire sans qu'il soit nécessaire d'apporter des modifications à votre code Django existant.
I exactement nécessaire pour que Maya SGED , le stockage et la séparation enfichable de base de données. En utilisant la plus récente bibliothèque PyMongo de Michael Dirolf, il était plutôt trivial d'obtenir un aller classe de base.
Pour l'utiliser:
from gridfsstorage import GridFSStorage
file = models.FileField(storage=GridFSStorage())
le fichier gridfsstorage.py:
import os
from django.core.files.storage import Storage
from django.utils.encoding import force_unicode
from django.conf import settings
from pymongo import Connection
from gridfs import GridFS
class GridFSStorage(Storage):
def __init__(self, *args, **kwargs):
self.db = Connection(host=settings.GRIDFS_HOST,
port=settings.GRIDFS_PORT)[settings.DATABASE_NAME]
self.fs = GridFS(self.db)
def save(self, name, content):
while True:
try:
# This file has a file path that we can move.
if hasattr(content, 'temporary_file_path'):
self.move(content.temporary_file_path(), name)
content.close()
# This is a normal uploadedfile that we can stream.
else:
# This fun binary flag incantation makes os.open throw an
# OSError if the file already exists before we open it.
newfile = self.fs.new_file(filename=name)
try:
for chunk in content.chunks():
newfile.write(chunk)
finally:
newfile.close()
except Exception, e:
raise
else:
# OK, the file save worked. Break out of the loop.
break
return name
def open(self, name, *args, **kwars):
return self.fs.get_last_version(name)
def delete(self, name):
oid = self.fs.get_last_version(name)._id
self.fs.delete(oid)
def exists(self, name):
return self.fs.exists(filename=name)
def path(self, name):
return force_unicode(name)
def size(self, name):
return self.fs.get_last_version(name).length
def move(self, old_file_name, name, chunk_size=1024*64):
# first open the old file, so that it won't go away
old_file = open(old_file_name, 'rb')
try:
newfile = self.fs.new_file(filename=name)
try:
current_chunk = None
while current_chunk != '':
current_chunk = old_file.read(chunk_size)
newfile.write(current_chunk)
finally:
newfile.close()
finally:
old_file.close()
try:
os.remove(old_file_name)
except OSError, e:
# Certain operating systems (Cygwin and Windows)
# fail when deleting opened files, ignore it. (For the
# systems where this happens, temporary files will be auto-deleted
# on close anyway.)
if getattr(e, 'winerror', 0) != 32 and getattr(e, 'errno', 0) != 13:
raise