定義一個自定義的儲存類步驟
1.你的自定義儲存類必須是django.core.files.storage.Storage的子類
2.Django必須能夠不帶任何參數來實例化你的儲存類。這意味着任何設置都應該從django.conf.settings中獲取。
3.你的儲存類必須實現 _open() 和 _save()方法,以及任何適合於你的儲存類的其它方法。
4.你的儲存類必須是 可以析構的,所以它在遷移中的一個字段上使用的時候可以被序列化。只要你的字段擁有自己可以序列化的參數,你就可以為它使用django.utils.deconstruct.deconstructible類裝飾器(這也是Django用在FileSystemStorage上的東西)。
自定義儲存類
創建工具包utils/fdfs包
複製客户端的配置文件client.conf到fdfs的包裏
修改client.conf配置文件
# the base path to store log files 記錄日誌文件 必須要有這個目錄
base_path=/home/python/bj18/ttsx/dailyfresh/log
# tracker_server can ocur more than once, and tracker_server format is
# "host:port", host can be hostname or ip address
tracker_server=192.168.137.130:22122
需要創建一個日誌文件的目錄/home/python/bj18/ttsx/dailyfresh/log
settings.py中配置文件路徑
# 設置django文件存儲類
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'
# 設置fdfs使用的client.conf路徑
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'
# 設置fdfs存儲服務器上nginx的IP和端口號
FDFS_URL = 'http://192.168.137.130:8000/'
在fdfs/storage.py中導入settings配置初始化FDFSStorage類
from django.core.files.storage import Storage # 導入storage工具類
from fdfs_client.client import Fdfs_client # 客户端上傳的類
from django.conf import settings # 導入django配置
class FDFSStorage(Storage): # 創建上傳類繼承Storage類
'''fast dfs文件存儲類'''
def __init__(self, client_conf=None, base_url=None):
if client_conf is None:
self.client_conf = settings.FDFS_CLIENT_CONF
if base_url is None:
self.base_url = settings.FDFS_URL
def _open(self, name, mode='rb'): # 必須要有的方法
'''打開文件時使用'''
pass
def _save(self, name, content): # 必須要有的方法
'''存儲文件時使用'''
# name: 你選擇上傳的文件的名字
# content:參數必須為django.core.files.File或者File子類的實例 即:包含你上傳文件內容的file類的對象
# 創建一個Fdfd_client對象
client = Fdfs_client(self.client_conf)
# 上傳文件到fast dfs系統中
# upload_by_buffer() 根據文件內容上傳文件
res = client.upload_by_buffer(content.read()) # 返回的是一個字典格式
# 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
# }
print(res)
if res.get('Status') != 'Upload successed.': # res.get()獲取字典裏的內容
# 上傳失敗 拋出異常
raise Exception('上傳文件到fdfs失敗')
# 獲取文件id
filename = res.get('Remote file_id')
# 返回文件id
return filename
def exists(self, name): # 調用_save()前會先調用exists()方法
'''django判斷文件名是否可用'''
return False; # False表示沒有這個文件名 該文件名可用
def url(self, name): # 如果沒有這個 在admin顯示詳情的時候會報url()的錯
'''返回文件url路徑'''
return self.base_url+name # 一定要加上路徑 不然會導致src導入圖片的時候沒有路徑不顯示
進入後台192.168.137.130:8000/admin
添加圖片看效果