天天看點

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的預設存儲類