Pregunta

Puede alguien me punto a cualquier proyectos de Apps / django que proporcionan un sistema de almacenamiento a medida enchufable así que puedo utilizar GridFS con Django para almacenar la carga de archivos?

He encontrado django-mongodb pero tampoco parece apoyar GridFS, ni django-almacenes.

Tengo la intención de ejecutar MySQL para las bases de datos requrements normales y sólo utilizar mongodb para el almacenamiento de archivos, por lo que tener claro que no quiero utilizar mongodb como mi base de datos principal.

¿Fue útil?

Solución

Trabajo en PyMongo, el conductor MongoDB Python, y no he oído hablar de cualquier proyecto para proporcionar almacenamiento a medida para Django usando GridFS. Esto parece que no sería muy difícil escribir en la parte superior de PyMongo: probablemente podría ser una traducción directa de la GridFS API en el almacenamiento Django API. Tal vez podría echar un vistazo a tirar algo juntos en algún momento, pero esto sería un gran proyecto de código abierto para cualquiera que desee participar.

Otros consejos

I implementado recientemente la GridFS apoyo en Mongoengine la que le gustaría pago y envío. Esto incluye un motor de almacenamiento de Django, que se puede conectar a la derecha en usted proyectos y utilizar con ImageField etc. Estoy usando estas tecnologías en la producción y se está sosteniendo muy bien hasta ahora.

django-mongodb-motor podría valer la pena un vistazo, ya que permite usted pueda hacer eso sin la necesidad de realizar cambios en el código de Django existente.

que necesitaba exactamente eso para Maya EDMS , almacenamiento enchufable y la separación de bases de datos. Usando la última biblioteca PyMongo de Michael Dirolf, que era bastante trivial para obtener una clase básica de ir.

Para usarlo:

from gridfsstorage import GridFSStorage
file = models.FileField(storage=GridFSStorage())

gridfsstorage.py el archivo:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top