您的位置:

NotImplementedError("subclasses of Storage must provide a size() method")的处理方案

  发布时间:2023-04-05 07:59:11
报错的原因这个错误是由于你在使用Django框架中的存储系统时,你自定义的存储类没有实现 `size()` 方法。首先在你自定义的存储类里,加入一个方法,在这个方法里计算出文件的大小并返回即可计算文件大小的代码或者你可以继承而不是来避免这个错误,因为`FileSystemStorage`已经实现了`size()` 方法,你只需要继承它即可你可以在这里覆盖任何FileSystemStorage中的方法总之,你需要确保你自定义的存储类中有一个 `size()` 方法,并且它能够正确地计算文件的大小。

报错的原因

这个错误是由于你在使用Django框架中的存储系统(如FileSystemStorage)时,你自定义的存储类没有实现 `size()` 方法。在Django中,存储系统是通过继承 `django.core.files.storage.Storage` 类来实现的,而这个类中有一个 `size()` 方法是必须要实现的,因此如果你没有在自定义的存储类中实现这个方法,就会抛出这个错误。

如何解决

解决这个错误的方法很简单,只需要在自定义的存储类中实现 `size()` 方法即可。

首先在你自定义的存储类里,加入一个 `size(self, name)` 方法,在这个方法里计算出文件的大小并返回即可。


from django.core.files.storage import Storage

class MyStorage(Storage):
    def size(self, name):
        # ... 计算文件大小的代码
        return file_size

或者你可以继承 `django.core.files.storage.FileSystemStorage` 而不是 `django.core.files.storage.Storage`来避免这个错误,因为`FileSystemStorage`已经实现了`size()` 方法,你只需要继承它即可。


from django.core.files.storage import FileSystemStorage

class MyStorage(FileSystemStorage):
    # 你可以在这里覆盖任何FileSystemStorage中的方法

总之,你需要确保你自定义的存储类中有一个 `size()` 方法,并且它能够正确地计算文件的大小。

使用例子

当然,下面是一个简单的例子,展示了如何在自定义的存储类中实现 `size()` 方法。


from django.core.files.storage import Storage
import os

class MyStorage(Storage):
    def _open(self, name, mode='rb'):
        pass

    def _save(self, name, content):
        pass

    def delete(self, name):
        pass

    def exists(self, name):
        return False

    def listdir(self, path):
        pass

    def size(self, name):
        file_path = self.path(name)
        return os.path.getsize(file_path)

这个例子中,我们通过使用 Python 标准库中的 `os.path.getsize()` 函数来计算文件的大小。在这个例子中,我们使用了 `self.path(name)` 方法来获取文件的路径,这是一个 `Storage` 类中的方法。

还有,我之前提到过你也可以继承 `django.core.files.storage.FileSystemStorage` 而不是 `django.core.files.storage.Storage`来避免这个错误,如果你继承 `FileSystemStorage` 你就不需要实现 `size()` 方法了。


from django.core.files.storage import FileSystemStorage

class MyStorage(FileSystemStorage):
    # 你可以在这里覆盖任何FileSystemStorage中的方法

以上是两种解决方案,你可以根据你的需求来选择使用哪种。