文章目录
- 前言
- 一、自定义的存储系统类
- 二、配置文件中
- 三、页面中使用
- 1.原本
- 2.自定义后
- 补充
前言
如果你需要提供自定义文件储存功能把文件储存在远程系统中,Django可以自定义一个存储类可以完成这一任务。
一、自定义的存储系统类
代码语言:javascript复制# 自定义存储类,重写url方法
"""
1. 您的自定义存储系统必须是以下的子类 django.core.files.storage.Storage
2.Django必须能够在没有任何参数的情况下实例化您的存储系统。
这意味着任何设置都应该来自django.conf.settings
3.您的存储类必须实现_open()和_save() 方法以及适用于您的存储类的任何其他方法
4.您的存储类必须是可解构的, 以便在迁移中的字段上使用时可以对其进行序列化。
只要您的字段具有可自行序列化的参数,就 可以使用
django.utils.deconstruct.deconstructible类装饰器
(这就是Django在FileSystemStorage上使用的)
"""
from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
@deconstructible
class MyStorage(Storage):
# def __init__(self, option=None):
# if not option:
# option = settings.CUSTOM_STORAGE_OPTIONS
def _open(self, name, mode='rb'):
pass
def _save(self, name, content, max_length=None):
pass
def url(self, name):
# name 其实就是 file_id
return 'http://192.168.229.148:8888/' name
二、配置文件中
代码语言:javascript复制# 自定义完成了存储类之后,告诉系统,使用我们的自定义存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.faststorage.MyStorage'
三、页面中使用
只需要在字段中假url如下
1.原本
代码语言:javascript复制<img src="{{ content.image }}">
2.自定义后
代码语言:javascript复制<img src="{{ content.image.url}}">
补充
在你的存储类中,除了其他自定义的方法外,还必须实现 _open()
以及 _save()
方法。另外,如果你的类提供了本地文件存储,它必须重写 path() 方法。
- _open(name, mode=‘rb’)
被Storage.open()调用,在打开文件时被使用。
- _save(name, content)
被Storage.save()调用,name是传入的文件名,content是Django接收到的文件内容,该方法需要将content文件内容保存。
Django会将该方法的返回值保存到数据库中对应的文件字段,也就是说该方法应该返回要保存在数据库中的文件名称信息。
- exists(name)
如果名为name的文件在文件系统中存在,则返回True,否则返回False。
- url(name)
返回文件的完整访问URL
- delete(name)
删除name的文件
- listdir(path)
列出指定路径的内容
- size(name)
返回name文件的总大小