django保存静态文件时,默认使用FileSystemStorage类(里面有save()方法)
如果我们需要更改django文件存储的行为,就需要自定义(继承重写)静态文件存储类
- 在开发环境中安装fdfs_client-py-master包
#cd 到fdfs_client-py-master.zip文件所在目录下
sudo pip3 install fdfs_client-py-master.zip
- 在项目目录下新建utils文件夹(python文件夹),在utils文件夹下新建fdfs文件夹,将client.conf文件放到该文件夹下
- 在settings.py中配置fdfs客户端配置文件和nginx的路由
#设置fastdfs使用的client.conf文件路径
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'
#设置fastdfs存储服务器上nginx的ip和port
FDFS_URL = 'http://nginx的ip:nginx的端口/'
- 自定义fastdfs文件存储类
在fdfs文件夹下面创建一个storage.py文件,编写代码
from django.core.files.storage import Storage
from fdfs_client.client import fdfs_client
from 项目名称 import settings #导入项目的settings.py模块
class FDFSStorage(Storage):
'''fastdfs文件存储类'''
def __init__(self,client_conf=None,base_url=None):
'''初始化'''
#如果用户没有传自己的fastdfs客户端配置文件,则使用默认的路径
if client_conf is None:
client_conf = FDFS_CLIENT_CONF
self.client_conf = client_conf
#如果用户没有传进来自己的nginx路由,则使用我们的默认路由
if base_url is None:
base_url = FDFS_URL
self.base_url = base_url
#重写_open()方法,用于打开文件,规定必须重写,但是我们这里用不到,这届pass
def _open(self,name,mode='rb'):
pass
#保存文件的方法
#通过admin上传文件时,django会帮调这个方法
def __save(self,name,content):
'''
:param name:你选择的上传文件的名字
:param content:File类的对象,包含你上传的文件内容,有了这个对象就可以获取文件内容
:return: 被保存文件的id
'''
#创建一个fdfs_client对象
client = Fdfs_client(self.client_conf)
#上传文件到fastdfs系统中
#upload_by_buffer()方法是根据文件内容上传文件,返回值格式为字典:#dict {
# 'Group name' : group_name,
# 'Remote file_id' : remote_file_id,
# 'Status' : 'Upload successed.',
# 'Local file name' : '',
# 'Uploaded size' : upload_size,
# 'Storage IP' : storage_ip
# }
res = client.upload_by_buffer(content:read())
#判断是否上传成功
if res.get('Status') != 'Upload successed.':
#上传失败
raise Exception('上传文件到fastdfs失败')
#获取返回的文件id
filename = res.get('Remote file_id')
return filename
#django在上传文件之前,会先调用该方法,用于判断文件名是否可用(但文件其实保存在fastdfs中,所以这里直接返回false就行)
def exists(self,name):
return False
#该方法用于向nginx和fastdfs请求拿保存的静态文件
#返回你要访问文件的url路径
#不写时在请求文件时会报错:subclasses of Storage must provide a url() method
def url(self,name):
'''
:param name django保存文件到fastdfs后fastdfs返回给django的文件id
:return 你要访问的文件在nginx中的url
'''
return self.base_url + name
将提供的client.conf文件放到utils文件夹下
#修改client.conf文件中用于记录日志文件的路径,该路径在你的系统中必须存在:
base_path = xxxx
#修改fastDFS的tracker_server的ip地址
tracker_server = tracker_server所在的ip地址:22122
- 在settings.py中设置django的默认存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'