编写自定义存储系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/boyun58/article/details/89763443

如果您需要提供自定义文件存储 - 一个常见示例是将文件存储在某个远程系统上 - 您可以通过定义自定义存储类来实现。

您需要按照以下步骤操作:

1.您的自定义存储系统必须是以下的子类 django.core.files.storage.Storage:

from django.core.files.storage import Storage

class MyStorage(Storage):
    ...

2.Django必须能够在没有任何参数的情况下实例化您的存储系统。这意味着任何设置都应该来自django.conf.settings:

from django.conf import settings
from django.core.files.storage import Storage

class MyStorage(Storage):
    def __init__(self, option=None):
        if not option:
            option = settings.CUSTOM_STORAGE_OPTIONS
        ...

3.您的存储类必须实现_open()和_save() 方法以及适用于您的存储类的任何其他方法。此外,如果您的类提供本地文件存储,则它必须覆盖该path()方法。

4.您的存储类必须是可解构的, 以便在迁移中的字段上使用时可以对其进行序列化。只要您的字段具有可自行序列化的参数,就 可以使用 django.utils.deconstruct.deconstructible类装饰器(这就是Django在FileSystemStorage上使用的)。

默认情况下,以下方法引发NotImplementedError,通常必须重写:

  • Storage.delete()
  • Storage.exists()
  • Storage.listdir()
  • Storage.size()
  • Storage.url()

_open(name,mode =‘rb’)
调用时Storage.open(),这是存储类用于打开文件的实际机制。这必须返回一个File对象,但在大多数情况下,您需要返回一些子类,它实现了特定于后端存储系统的逻辑。

_save(name,content)
Storage.save()。该name会已经走过了 get_valid_name()和get_available_name(),而content将是一个 File对象本身。
应该返回保存文件名的实际名称(通常是name 传入的,但如果存储需要更改文件名,则返回新名称)。

get_valid_name(name)
返回适合与底层存储系统一起使用的文件名。name传递给此方法的 参数是发送到服务器的原始文件名,或者,如果upload_to是可调用的,则在删除任何路径信息后由该方法返回的文件名。重写此选项可自定义非标准字符转换为安全文件名的方式。

提供的代码Storage仅保留原始文件名中的字母数字字符,句点和下划线,删除其他所有内容。

get_available_name(name,max_length = None)
返回存储机制中可用的文件名,可能会考虑提供的文件名。根据name上述方法,传递给此方法的参数将已清除为对存储系统有效的文件名get_valid_name()。

如果提供max_length,文件名的长度不能超过max_length。如果找不到空闲的唯一文件名,则会引发异常SuspiciousFileOperation。

如果文件name已存在,则在扩展名之前将下划线加上随机的7个字符的字母数字字符串附加到文件名。

猜你喜欢

转载自blog.csdn.net/boyun58/article/details/89763443