django中重寫Storage中的url函數實現自動給mysql的Image屬性鏈接增加域名出現{{ no such element: django.db.models.fields.files.ImageFieldFile object["url"] }}


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/'

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM