【愚公系列】2022年01月 Django商城项目 23-自定义文件存储系统

2022-02-01 09:33:11 浏览数 (1)

文章目录

  • 前言
  • 一、自定义的存储系统类
  • 二、配置文件中
  • 三、页面中使用
    • 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文件的总大小

0 人点赞