1.根據課件上的教材重寫Storage的url函數,方法如下:
from django.core.files.storage import Storage from django.conf import settings class FastDFSStorage(Storage): """自定義文件存儲類""" def __init__(self, fdfs_base_url=None): """文件存儲類的初始化方法""" # if not fdfs_base_url: # self.fdfs_base_url = settings.FDFS_BASE_URL # self.fdfs_base_url = fdfs_base_url self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL def _open(self, name, mode='rb'): """ 打開文件時會被調用的:文檔告訴我必須重寫 :param name: 文件路徑 :param mode: 文件打開方式 :return: None """ # 因為當前不是去打開某個文件,所以這個方法目前無用,但是又必須重寫,所以pass pass def _save(self, name, content): """ PS:將來后台管理系統中,需要在這個方法中實現文件上傳到FastDFS服務器 保存文件時會被調用的:文檔告訴我必須重寫 :param name: 文件路徑 :param content: 文件二進制內容 :return: None """ # 因為當前不是去保存文件,所以這個方法目前無用,但是又必須重寫,所以pass pass def url(self, name): """ 返回文件的全路徑 :param name: 文件相對路徑 :return: 文件的全路徑(http://fastdfs所在服務器域名/group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg) """
# return "fastdfs所在服務器域名" + name
return self.fdfs_base_url + name
setting文件中增加:
DEFAULT_FILE_STORAGE = 'meiduo_mall.utils.fastdfs.fdfs_storage.FastDFSStorage' # FastDFS相關參數 FDFS_BASE_URL = fastdfs所在服務器域名
根據視頻和課件,老師都能通過,jinja2模板引擎調用url方法,給image屬性中的鏈接增加域名
但自己試了很多次就是不行,
出現如下錯誤:
分析原因可能是因為,django在啟動時為調用重寫的Storage方法,無法查明為什么沒有調用.
在查找過程中發現,django其實已經封裝了給image屬性的鏈接增加域名的方法,如下:
方法為繼承了Storage方法的FileSystemStorage方法:
FileSystemStorage中的url函數:
如下圖base_url為如下函數:函數實現若_base_url存在則返回_base_url的值,若不存在則返回setting里的默認域名settings.MEDIA_URL
而_base_url則為init方法中動態傳入的域名
filepath_to_uri這用於判斷image屬性的鏈接是否為空,不為空則返回原來的值
最后使用urljoin方法拼接域名和鏈接,返回完整的鏈接
所以如果需要在連接前添加域名,不需要重新定義Storage的url函數(況且我重新定義了還出錯,弄了很久極其郁悶)
只需要在配置文件中加入一行代碼即可實現:
MEDIA_URL = 'http://域名:8888/'