django 1.8 官方文档翻译: 3-3-5 编写自定义存储系统

简介: 编写自定义存储系统如果你需要提供自定义文件存储 – 一个普遍的例子是在某个远程系统上储存文件 – 你可以通过定义一个自定义的储存类来实现。

编写自定义存储系统

如果你需要提供自定义文件存储 – 一个普遍的例子是在某个远程系统上储存文件 – 你可以通过定义一个自定义的储存类来实现。你需要遵循以下步骤:

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.listdir

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

根本上来说,需要实现哪种方法取决于你。如果不去实现一些方法,你会得到一个不完整(可能是不能用的)的接口。

你也会经常想要使用特意为自定义储存对象设计的钩子。它们是:

_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参数是发送给服务器的原始文件名称,并移除了所有目录信息。你可以覆写这个方法,来自定义非标准的字符将会如何转换为安全的文件名称。

Storage提供的代码只会保留原始文件名中的数字和字母字符、英文句号和下划线,并移除其它字符。

get_available_name(name, max_length=None)

返回在储存系统中可用的文件名称,可能会顾及到提供的文件名称。传给这个方法的name参数需要事先过滤为储存系统有效的文件名称,根据上面描述的get_valid_name() 方法。

如果提供了max_length,文件名称长度不会超过它。如果不能找到可用的、唯一的文件名称,会抛出SuspiciousFileOperation 异常。

如果name命名的文件已存在,一个下划线加上随机7个数字或字母的字符串会添加到文件名称的末尾,扩展名之前。

Changed in Django 1.7:

之前,下划线和一位数字(比如"_1", "_2",以及其他)会添加到文件名称的末尾,直到目标目录中发现了可用的名称。一些恶意的用户会利用这一确定性的算法来进行dos攻击。 这一变化也在1.6.61.5.9, 和 1.4.14中出现。
Changed in Django 1.8:

新增了max_length参数。

自定义储存系统 以相同方式工作:你可以把它们作为storage参数传递给FileField

译者:Django 文档协作翻译小组,原文:Custom storage

本文以 CC BY-NC-SA 3.0 协议发布,转载请保留作者署名和文章出处。

Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606。

相关文章
|
9天前
|
存储 关系型数据库 数据库
我将提供一个简化的Python代码示例和详解,以展示如何使用Python和Django框架来构建智能化小区综合物业管理系统的一部分功能。
我将提供一个简化的Python代码示例和详解,以展示如何使用Python和Django框架来构建智能化小区综合物业管理系统的一部分功能。
|
1月前
|
数据库 数据安全/隐私保护 Python
Web实战丨基于Django与HTML的新闻发布系统(二)
Web实战丨基于Django与HTML的新闻发布系统(二)
29 1
|
1月前
|
存储 数据库 数据安全/隐私保护
Web实战丨基于Django与HTML的新闻发布系统
Web实战丨基于Django与HTML的新闻发布系统
26 1
|
1月前
|
存储 搜索推荐 数据库
Web实战丨基于Django与HTML的用户登录验证系统
Web实战丨基于Django与HTML的用户登录验证系统
32 1
|
27天前
|
数据安全/隐私保护 Python
必知的技术知识:django自定义分页器
必知的技术知识:django自定义分页器
|
2月前
|
Python
Django 实现用户需求及反馈系统并支持图片上传
在这篇博客中,我们将介绍如何使用 Django 实现一个用户需求和反馈系统,支持用户上传图片,同时限制上传图片的总大小不超过 3MB。我们将从模型设计开始,然后编写表单和视图来处理用户请求和图片上传。
|
2月前
|
测试技术 数据安全/隐私保护 Docker
Docker部署开源项目Django-CMS企业内容管理系统
【5月更文挑战第20天】Docker部署开源项目Django-CMS企业内容管理系统
68 1
|
2月前
|
数据采集 自然语言处理 Python
在 Django 中设计爬虫系统的数据模型与多对多关系
在构建爬虫系统时,设计合理的数据模型和多对多关系对系统的性能和可维护性至关重要。本文将探讨如何使用 Django 来设计爬虫系统的数据模型。
|
2月前
|
前端开发 关系型数据库 MySQL
109-Django开发考试与问卷系统
该项目描述了用户、测试和权限三个核心模块的详细需求。用户模块包括注册(需验证信息并唯一性检查,密码安全存储,确认邮件)和登录(凭据验证,可选的“记住我”功能,防止暴力破解)。测试模块涉及题目、选项和分数设置,支持创建、编辑及自动评分。权限模块关注用户角色和权限管理,实现访问控制。其他考虑因素涵盖用户界面、数据库选择(如SQLite3和MySQL)、安全性最佳实践以及系统的可维护性和可扩展性。
22 3
|
2月前
|
前端开发 JavaScript UED
111-Django开发酒店管理系统
这个内容描述了一个基于Python Django框架的酒店管理系统,采用SimpleUI、Bootstrap和jQuery来设计界面和实现响应式布局及动态交互。系统有多个用户角色,包括管理员、店长、经理、接待客服和员工,每个角色有不同的权限,例如管理员可以管理所有模块,店长和经理则限于特定店铺或部门,而接待客服主要负责客人入住和预订管理。此外,系统还包含了房间管理、活动管理、预订管理、客房服务、注意事项和退款管理等多个功能模块。系统界面设计简洁直观,支持多设备适应。
65 0