Django文件存储类url()方法介绍
结论:
• 文件存储类url()方法的作用:返回name所代表的文件内容的URL。
• 文件存储类url()方法的触发:content.image.url
• 虽然表面上调用的是ImageField的url方法。但是内部会去调用文件存储类的url()方法。
• 文件存储类url()方法的使用:
• 我们可以通过自定义Django文件存储类达到重写url()方法的目的。
• 自定义Django文件存储类必须提供url()方法。
• 返回name所指的文件对应的绝对URL。
自定义Django文件存储类
自定义文件存储类的官方文档 : https://docs.djangoproject.com/en/2.2/howto/custom-file-storage/
class FastDFSStorage(Storage):
"""自定义文件存储系统"""
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
重写Django文件存储类url()方法
1.重写url()方法
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'):
......
def _save(self, name, content):
......
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.相关配置参数
# 指定自定义的Django文件存储类
DEFAULT_FILE_STORAGE = 'lgshop.utils.fastdfs.fdfs_storage.FastDFSStorage'
# FastDFS相关参数
# FDFS_BASE_URL = 'http://192.168.103.158:8888/'
FDFS_BASE_URL = 'http://image.meiduo.site:8888/'
fdfs_storage.py
# @Time:2021/3/23 17:49
# @Author:Ellen
# @File:fdfs_storage.py
from django.conf import settings
from django.core.files.storage import Storage
class FastDFSStorage(Storage):
"""自定义文件存储类"""
def __init__(self, fdfs_base_url=None):
# if not fdfs_base_url:
# self.fdfs_base_url = settings.FDFS_BASE_URL
# self.fdfs_base_url = fdfs_base_url
# 上面三行可以一行代码完成
self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL
# name是文件的路径 model 打开 content 文件内容
def _open(self, name, mode='rb'):
pass
def _save(self, name, content):
pass
def url(self, name):
"""
返回文件的全路径
:param name: 文件路径
:return: ip+port+文件路径
"""
return self.fdfs_base_url + name
重写后,index.html里可调用(url) image.url
开启虚拟机:打开storage tracker 页面可以展示出全部图片