django 项目中自定义静态文件存储类,将文件保存到fastDFS中

django保存静态文件时,默认使用FileSystemStorage类(里面有save()方法)
如果我们需要更改django文件存储的行为,就需要自定义(继承重写)静态文件存储类

  1. 在开发环境中安装fdfs_client-py-master包
#cd 到fdfs_client-py-master.zip文件所在目录下
sudo pip3 install fdfs_client-py-master.zip
  1. 在项目目录下新建utils文件夹(python文件夹),在utils文件夹下新建fdfs文件夹,将client.conf文件放到该文件夹下
  2. 在settings.py中配置fdfs客户端配置文件和nginx的路由
#设置fastdfs使用的client.conf文件路径
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'

#设置fastdfs存储服务器上nginx的ip和port
FDFS_URL = 'http://nginx的ip:nginx的端口/'
  1. 自定义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
  1. 在settings.py中设置django的默认存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值