2009-09-19 2 views
4

Может ли кто-нибудь указать мне на любые проекты/приложения django, которые предоставляют подключаемую пользовательскую систему хранения, поэтому я могу использовать GridFS с Django для хранения файлов?Пользовательская система хранения для GridFS (MongoDB)?

Я нашел django-mongodb, но он, похоже, не поддерживает GridFS, а также django-хранилища.

Я планирую запустить mysql для нормальных требований к базе данных и использовать mongodb для хранения файлов, чтобы быть ясным. Я не хочу использовать mongodb в качестве моей основной базы данных.

ответ

3

Я работаю над PyMongo, драйвером Python от MongoDB, и не слышал о каком-либо проекте для создания пользовательского хранилища для Django с использованием GridFS. Похоже, было бы не очень сложно писать поверх PyMongo: возможно, это был прямой перевод GridFS API на Django storage API. Возможно, в какой-то момент можно взглянуть на то, чтобы что-то собрать вместе, но это был бы отличный проект с открытым исходным кодом для любого, кто хочет принять участие.

+0

Просто добавил GitHub репо, содержащий бэкенд gridfs хранения http://goo.gl/tCFvf –

1

django-mongodb-engine может стоить того, чтобы он мог сделать это без необходимости внесения изменений в существующий код Django.

1

Недавно я внедрил GridFS support in Mongoengine, который вы можете проверить. Это включает в себя бэкэнд для хранения Django, который вы можете подключить прямо к вам в проектах и ​​использовать с ImageField и т. Д. Я использую эти технологии в производстве и до сих пор держусь здорово.

1

Мне это было необходимо именно для Mayan EDMS, с возможностью хранения и разделения базы данных. Используя последнюю библиотеку PyMongo Майкла Дирольфа, было довольно тривиально получить базовый класс.

Чтобы использовать его:

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

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 
Смежные вопросы