2009-09-19 7 views
4

Quelqu'un peut-il me diriger vers des projets/applications django qui fournissent un système de stockage personnalisé enfichable pour que je puisse utiliser GridFS avec Django pour stocker les téléchargements de fichiers?Système de stockage personnalisé pour GridFS (MongoDB)?

J'ai trouvé django-mongodb mais il ne semble pas supporter GridFS, ni django-storages.

Je prévois d'exécuter mysql pour les requrements de base de données normaux et seulement utiliser mongodb pour le stockage de fichiers afin d'être clair, je ne veux pas utiliser mongodb comme base de données principale.

Répondre

3

Je travaille sur PyMongo, le pilote MongoDB Python, et je n'ai entendu parler d'aucun projet de stockage personnalisé pour Django utilisant GridFS. Cela ressemble à ce ne serait pas très difficile d'écrire sur PyMongo: pourrait être une traduction directe du GridFS API sur le Django storage API. Peut-être pourrait-on jeter un coup d'œil à quelque chose ensemble, mais ce serait un excellent projet open-source pour quiconque voudrait s'impliquer.

+0

ajouté un contenant repo github le backend de stockage de GridFS http://goo.gl/tCFvf –

1

django-mongodb-engine peut valoir le coup d'oeil car il vous permet de le faire sans avoir besoin de faire des changements à votre code Django existant.

1

J'ai récemment mis en place le GridFS support in Mongoengine que vous aimeriez commander. Cela inclut un backend de stockage Django que vous pouvez brancher directement sur vos projets et utiliser avec ImageField, etc. J'utilise ces technologies en production et ça marche très bien jusqu'ici.

1

J'avais exactement besoin de cela pour Mayan EDMS, stockage enfichable et séparation de base de données. En utilisant la dernière bibliothèque PyMongo de Michael Dirolf, il était plutôt trivial d'avoir un cours 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 
Questions connexes