django 自定义文件存储类

1:image = models.ImageField()的底层实现原理

 

 

 

 

 

 

结论:

  • 文件存储类url()方法的作用:返回name所代表的文件内容的URL。
  • 文件存储类url()方法的触发:content.image.url
    • 虽然表面上调用的是ImageFieldurl方法。但是内部会去调用文件存储类的url()方法。
  • 文件存储类url()方法的使用:
    • 我们可以通过自定义Django文件存储类达到重写url()方法的目的。
    • 自定义Django文件存储类必须提供url()方法。
    • 返回name所指的文件对应的绝对URL。

2:自定义文件存储系统的官方文档(https://docs.djangoproject.com/en/1.11/howto/custom-file-storage/

 (1):自动定义文件存储类

from django.core.files.storage import Storage
from django.conf import  settings

class FastDFSStorage(Storage):
    """自定义文件存储系统,修改存储的方案"""
    def __init__(self,fdfs_base_url=None):
        """
               构造方法,可以不带参数,也可以携带参数
               :param base_url: Storage的IP
               """
        self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL

    def _open(self, name, mode='rb'):
        """
        用于打开文件
        :param name: 要打开的文件的名字
        :param mode: 打开文件方式
        :return: None
        """
        # 打开文件时使用的,此时不需要,而文档告诉说明必须实现,所以pass
        pass

    def _save(self, name, content):
        """
        用于保存文件
        :param name: 要保存的文件名字
        :param content: 要保存的文件的内容
        :return: None
        """
        # 保存文件时使用的,此时不需要,而文档告诉说明必须实现,所以pass
        pass

    def url(self, name):
        """
        返回name所指文件的绝对URL
        :param name: 要读取文件的引用:group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg
        :return: http://192.168.103.158:8888/group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg
        """
        # return 'http://192.168.103.158:8888/' + name
        # return 'http://image.meiduo.site:8888/' + name
        return self.fdfs_base_url + name

(2):修改相关配置

#自动定义文件存储类
FDFS_BASE_URL = "ip:8888"
# 指定自定义的Django文件存储类
DEFAULT_FILE_STORAGE = 'meiduo_demo.utils.fastdfs.fdfs_storage.FastDFSStorage'

(3).添加访问图片的域名

  • /etc/hosts中添加访问Storage的域名
 
$ Storage的IP        域名
$ 192.168.103.158    image.meiduo.site

 

 

posted on 2020-10-08 08:59  paike123  阅读(453)  评论(0)    收藏  举报

导航