Django 2.1.3 视图层 自定义存储系统

管理文件 | 总目录 | 基于类的视图


如果你需要提供自定义文件储存功能——一个常用的场景是,把文件储存在远程系统中——自定义一个存储类可以完成这一任务来完成。下面是需要完成的具体步骤:

自定义存储系统的步骤

1. 继承Storage

你自定义的存储系统必须为 django.core.files.storage.Storage的一个子类:

from django.core.files.storage import Storage

class MyStorage(Storage):
    ...

2. 设置文件中配置参数

Django必须能以无参数实例化你的存储系统。意味着所有设置都应从dango.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. deconstructible

您的存储类必须是deconstructible,以便在迁移中的字段上使用它时可以序列化。 只要你的字段有自己的参数可以自动序列化,你可以使用django.utils.deconstruct.deconstructible类装饰器(这是Django在FileSystemStorage上使用的)。

@deconstructible
class FileSystemStorage(Storage):
    """
    Standard filesystem storage
    """

5. 其他可选项

默认情况,下面的方法会引发一个 NotImplementedError,通常需要重写。

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

然而并非所有方法都是需要的,并且可能故意被省略。

举例来说,如果列出某些存储后端的内容会比较消耗性能,那么您可以决定不实现Storage.listdir方法。

另一个例子是只处理写入文件的后端。在这种情况下,你不需要实现上述任何方法。

最终,你决定实现这些方法中的一些。另一些未实现的方法会生成部分(可能会损坏的)接口。

你可能也经常会用到专为自定义存储对象设计的 钩子函数。他们是:

_open(name, mode=‘rb’)

必须重写(因为父类没有实现).

它将被Storage.open()调用,这才是存储类用来打开文件的真正机制,这个方法必须要返回一个文件对象。尽管在大多数时候,你想要这个方法返回一个继承于特定逻辑的后台存储系统的子类。

_save(name, content)

它将被Storage.save()调用。这个 name 早已经过get_valid_name()get_available_name(),并且 content 将会成是 File对象自身。

应该返回保存的文件名的实际名称(通常是传入“name”,但如果内存需要改变文件名,则返回新名称)。

get_valid_name(name)

返回适用于底层存储系统的文件名。 传递给此方法的name参数既不是发送给服务器的原始文件名也不是upload_toupload_to是可调用的),则在删除任何路径信息后由该方法返回的文件名。 重写此操作可以自定义如何将非标准字符转换为安全文件名。

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

get_available_name(name, max_length=None)

返回存储机制中可用的文件名,可能会考虑提供的文件名。 根据上述get_valid_name()方法,传递给此方法的name参数已经被处理为一个对存储系统有效的文件名。

返回的文件名的长度不会超过max_length,如果该参数被提供的话。若找不到一个可用的独一无二的文件名,则抛出一个SuspiciousFileOperation 异常。

如果已经存在一个 name 的文件,则会在扩展后缀前添加下划线和7位随机字母。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值