编写自定义存储系统

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

1. 你的自定义储存类必须是django.core.files.storage.Storage的子类:

from django.core.files.storage import Storageclass MyStorage(Storage):...

2. Django必须能够不带任何参数来实例化你的储存类。这意味着任何设置都应该从django.conf.settings中获取。

from django.conf import settings
from django.core.files.storage import Storageclass 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()

然而要注意,并不是这些方法全部都需要,可以故意省略一些。可以不必实现每个方法而仍然能拥有一个可以工作的储存类。

比如,如果在特定的储存后端中,列出内容的开销比较大,你可以决定不实现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.6, 1.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。

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

  1. django 1.8 官方文档翻译: 2-5-7 自定义查找

    自定义查找 New in Django 1.7. Django为过滤提供了大量的内建的查找(例如,exact和icontains).这篇文档阐述了如何编写自定义查找,以及如何修改现存查找的功能.关于查 ...

  2. django 1.8 官方文档翻译: 2-5-6 多数据库

    多数据库 这篇主题描述Django 对多个数据库的支持.大部分Django 文档假设你只和一个数据库打交道.如果你想与多个数据库打交道,你将需要一些额外的步骤. 定义你的数据库 在Django中使用多 ...

  3. django 1.8 官方文档翻译:2-1-1 模型语法

    模型 模型是你的数据的唯一的.权威的信息源.它包含你所储存数据的必要字段和行为.通常,每个模型对应数据库中唯一的一张表. 基础: 每个模型都是django.db.models.Model 的一个Pyt ...

  4. django 1.8 官方文档翻译:7-2 管理操作

    管理操作 简而言之,Django管理后台的基本流程是,"选择一个对象并改变它".在大多数情况下,这是非常适合的.然而当你一次性要对多个对象做相同的改变,这个流程是非常的单调乏味的. ...

  5. django 1.8 官方文档翻译:13-3 日志

    日志 日志快速入门 Django 使用Python 内建的logging 模块打印日志.该模块的用法在Python 本身的文档中有详细的讨论.如果你从来没有使用过Python 的logging 框架( ...

  6. django 1.8 官方文档翻译:5-1-2 表单API

    表单 API 关于这篇文档 这篇文档讲述Django 表单API 的详细细节.你应该先阅读表单简介. 绑定的表单和未绑定的表单 表单要么是绑定的,要么是未绑定的. 如果是绑定的,那么它能够验证数据,并 ...

  7. django 1.8 官方文档翻译: 3-3-4 管理文件

    管理文件 这篇文档描述了Django为那些用户上传文件准备的文件访问API.底层的API足够通用,你可以使用为其它目的来使用它们.如果你想要处理静态文件(JS,CSS,以及其他),参见管理静态文件(C ...

  8. django 1.8 官方文档翻译: 3-3-1 文件上传

    文件上传 当Django在处理文件上传的时候,文件数据被保存在request. FILES (更多关于 request 对象的信息 请查看 请求和响应对象).这篇文档阐述了文件如何上传到内存和硬盘,以 ...

  9. django 1.8 官方文档翻译: 1-2-3 编写你的第一个Django应用,第3部分

    编写你的第一个 Django 程序 第3部分 本教程上接 教程 第2部分 .我们将继续 开发 Web-poll 应用并且专注在创建公共界面 – "视图 (views )". 哲理 ...

最新文章

  1. Android app 启动页尺寸大小 忘记了怎么办
  2. 你敢参与,我就敢送!牛转好运来,新春大抽奖
  3. 【Nginx】epoll事件驱动模块
  4. java 自定义tostring_自定义java toString方法
  5. MyBatis-07MyBatis注解方式之@Select
  6. python爬虫搜特定内容的论文_python基于BeautifulSoup实现抓取网页指定内容的方法...
  7. Java 修饰符、运算符笔记总结
  8. [转]C#操作XML方法详解
  9. idea 错误: 找不到或无法加载主类(汇总贴)
  10. (转) 基于MapReduce的ItemBase推荐算法的共现矩阵实现(一)
  11. 离散余弦变换原理及实现【转载】
  12. oracle/PL/SQL编程(4)
  13. 比例风险(Cox)回归模型——Proportional hazards model
  14. 使用Audacity制作ACX有声读物 ACX Audiobook Production Using Audacity
  15. 【学习随记】Ubuntu使用U盘相关问题
  16. 设计一个名为 MyRectangle 的矩形类来表示矩形
  17. 在线ico图标制作、python代码实现ico格式转换
  18. MySQL三大日志——binlog、redoLog、undoLog详解
  19. 有一个8位机,采用单总线结构......(计算机组成原理课后习题)
  20. ROS kinetic 机器视觉

热门文章

  1. System verilog随机函数$urandom输出8bit随机数
  2. 一文带你入门C++,类与对象、6个默认成员函数、this指针以及static关键字。
  3. java 8和jdk区别_java-8 – JDK 6和JDK8之间的Java Collection差异
  4. set get java_JAVA中关于set()和get()方法的理解及使用
  5. mysql存储过程执行报错1175_mysql 数据库 存储过程执行报错的解决办法
  6. 如何在Android中使用OpenCV
  7. MongoDB的增删改查
  8. python-day19-面向对象进阶-加载顺序,命名空间,组合(实现松耦合)
  9. centos下安装opencv
  10. 13.1.DataGrid的增、删、改、查前台页面