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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top