2017-08-10 1 views
0

Je tente de créer un custom file storage class pour mon application Django qui enregistre de manière transparente un hachage de tous les fichiers enregistrés.Impossible de lire Django FieldFile dans un stockage personnalisé

Ma classe de stockage de test est assez trivial:

from django.core.files.storage import Storage 
from django.db.models.fields.files import FieldFile 

from utils import get_text_hash 

class MyStorage(Storage) 

    def _save(self, name, content): 
     if isinstance(content, FieldFile): 
      raw_content = content.open().read() 
     else: 
      raw_content = content 
     assert isinstance(raw_content, basestring) 
     print(get_text_hash(raw_content)) 
     return super(MyStorage, self)._save(name, content) 

Cependant, quand je tente de sauvegarder un fichier dans mon application, je reçois l'erreur:

'NoneType' object has no attribute 'read' 

avec le retraçage se terminant le ligne:

raw_content = content.open().read() 

Pourquoi open() retour Aucun au lieu d'un descripteur de fichier? Quelle est la bonne façon d'accéder à votre contenu de fichier brut dans une classe de stockage Django?

Répondre

0
raw_content = content.open().read() 

changement

raw_content = content.read() 

Je pense que vous pouvez vérifier ces manuels.

Django Manual _save

_save(name, content)¶ Called by Storage.save(). The name will already have gone through get_valid_name() and get_available_name(), and the content will be a File object itself.

donc le contenu est objet fichier.

Django Manual FieldFile.open

Opens or reopens the file associated with this instance in the specified mode. Unlike the standard Python open() method, it doesn’t return a file descriptor.