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