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

举报
愚公搬代码 发表于 2022/01/31 16:13:39 2022/01/31
【摘要】 前言如果你需要提供自定义文件储存功能把文件储存在远程系统中,Django可以自定义一个存储类可以完成这一任务。 一、自定义的存储系统类# 自定义存储类,重写url方法"""1. 您的自定义存储系统必须是以下的子类 django.core.files.storage.Storage2.Django必须能够在没有任何参数的情况下实例化您的存储系统。 这意味着任何设置都应该来自django...

前言

如果你需要提供自定义文件储存功能把文件储存在远程系统中,Django可以自定义一个存储类可以完成这一任务。

一、自定义的存储系统类

# 自定义存储类,重写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

二、配置文件中

# 自定义完成了存储类之后,告诉系统,使用我们的自定义存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.faststorage.MyStorage'

三、页面中使用

只需要在字段中假url如下

1.原本

<img src="{{ content.image }}">

2.自定义后

<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文件的总大小

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。