无法在自定义存储中读取Django FieldFile

时间:2017-08-10 01:36:01

标签: python django django-storage

我试图为我的Django应用程序制作March 17, 2015,透明地记录所有已保存文件的哈希值。

我的测试存储类非常简单:

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)

然而,当我尝试在我的应用程序中保存文件时,我收到错误:

'NoneType' object has no attribute 'read'

回溯结束于该行:

raw_content = content.open().read()

为什么open()返回None而不是文件句柄?在Django存储类中访问原始文件内容的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

raw_content = content.open().read()

更改为

raw_content = content.read()

我认为您可以查看这些手册。

Django Manual _save

  

_save(name,content)¶由Storage.save()调用。该名称已经通过get_valid_name()和get_available_name()以及   content将是一个File对象本身。

所以内容是File对象。

Django Manual FieldFile.open

  

打开或重新打开与此实例关联的文件   指定模式。与标准的Python open()方法不同,它没有   返回文件描述符。