亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django怎么把靜態文件緩存到云服務

發布時間:2021-08-17 17:34:02 來源:億速云 閱讀:131 作者:chen 欄目:開發技術

這篇文章主要介紹“Django怎么把靜態文件緩存到云服務”,在日常操作中,相信很多人在Django怎么把靜態文件緩存到云服務問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Django怎么把靜態文件緩存到云服務”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1.collectstatic命令

首先 Django有一個collectstatic的命令,該腳本的功能是將本地的靜態文件以及需要的依賴,例如Django和python自己需要的靜態文件等打包到一個統一的目錄下。這有點類似于maven發布前的打包功能。

這個腳本一般在上線的時候會執行。例如我們的啟動腳本里這么寫的:

sh collectstatic.sh

然后在djang的配置文件里加這么一行:

static-map = /static=./static_files

我們將本地的靜態文件打包發送到云服務就是用collectstatic來實現的。

2.如何發布到云服務

方法非常簡單,代碼也非常少,但是貌似很多地方都沒說清楚為什么,害的我搞了好久,白了很多垃圾代碼。

首先你要新建一個繼承了Storage的類,例如這樣子:

@deconstructible
class CosStorage(Storage):

上面的注解也必須要有的。

然后在很多材料里會將,要在這里類里實現多個方法,有的是以_開頭,有的就是普通的類,我理解_開頭的主要是collectstatic執行的方法,而不帶的是程序執行的時候調用的。前者類似java中的各類service,程序啟動的時候就會執行。而后者類似controller下的接口,只有外部調用的時候才會執行。

以_開頭的方法最重要的是下面這三個:

def __init__(self):
        logging.info('init cos file list...')
        self.get_cos_file_list()
 
    # 看看這里是否需要
    def _open(self, name, mode='r'):
        return File(open(self.path(name), mode))
 
    def _save(self, name, content):       
        cms.util.upload_os_file(FileBizType.TRUMAN_CMS_STATIC_FILES, content, name, name)         
            time.sleep(0.02)

__init__自然是為了初始化而設置的。根據需要寫對應的代碼,例如調用云服務需要的簽名等等

_open()這個我當時忘了測試一下有沒有用了,按道理這里是打開文件的,反正我是上么這么寫的。

_save(self, name, content)是最關鍵的代碼。這個接口是理解Storage的兩大鑰匙。這個方法的功能是處理當前已經打開的文件,文件標題就是name,content就是將文件內容轉換成的字節流,你直接用就行。這個該怎么理解呢?

name的含義:假如你的靜態路徑很深,文件很多,類型也很雜。那么Storage首先就幫你處理路徑的問題了,name就是相對路徑+文件名。所以你傳的時候使用name就將相對目錄一起傳過去了。

content的含義:content就是文件的內容,不管是js、css、還是圖標圖片,在網絡傳的時候都會先轉換成字節流是不是。這里的content就是當前文件的字節流。所以就使用upload_os_file(content) 就將文件內容發出去了,不需要自己再讀文件 ,轉換成字節流等操作。不過這里的upload_os_file是我自己的業務代碼,你可以根據需要做對應的實現。

另外一個重要的問題是_save一次只處理一個文件,所以你寫這個方法里的代碼的時候只要考了一個文件就行了,不用多此一舉寫批量等邏輯。

這里還有一點就是如果不加限制,_save的執行速度會非常快 ,一下就將所有文件全部讀到,并且一個文件一個請求全部發出去,這可能導致服務端來不及處理而被拒絕等情況。方法也很簡單,_save里加個等待就行了

time.sleep(0.02)

上面的代碼在服務啟動過程中執行到collectstatic時會自動掃描,自動加載,自動執行,但是你要在自己的配置文件中添加如下信息,否則會找不到。

STATICFILES_STORAGE = 'cos.cos_storage.CosStorage'

3.訪問時是如何重定向到cos的

將文件存到云服務之后,頁面執行的時候怎么訪問呢?

這就涉及到Storage的其他幾個方法了,主要是:

def listdir(self, path):
        pass
 
    def delete(self, name):
        pass
 
    def size(self, name):
        pass
 
    def url(self, name):
      url = cms.util.get_file_os_download_url(name)
        return url
 
    def exists(self, name):
        pass

  上面看名字我們就能大致知道功能,最重要的是url()方法,這個是理解Storage的第二把鑰匙。

這里的name就是文件在云服務中的相對路徑,你需要將拼接一下你的域名等就是文件的地址了。然后返回就行了。

如果靜態文件都是公開的,這里的url貌似不寫也行,能夠自動實現將域名和文件相對路徑拼接程完整的訪問url。

但是在我們的系統中,靜態文件是不允許直接訪問,需要帶簽名的。 所以我們這里需要在url里通過自定義的get_file_os_download_url()方法去訪問我們另外一個服務。

但是這里有一個坑,就是python的基礎包中也會用相對路徑訪問自己的靜態文件,也就是這么寫"/title.png"等,這種情況無法被url攔截到。因為我們業務的代碼里是統一加前綴/static/的。

到此,關于“Django怎么把靜態文件緩存到云服務”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

织金县| 武强县| 景谷| 宁明县| 霍城县| 琼结县| 仁寿县| 延吉市| 绥阳县| 东乌| 龙口市| 惠来县| 新河县| 任丘市| 泰兴市| 唐海县| 宁安市| 永康市| 淄博市| 呼图壁县| 志丹县| 枞阳县| 鞍山市| 镇雄县| 耒阳市| 金坛市| 广东省| 临沂市| 贵州省| 金华市| 江北区| 大同县| 扬中市| 富阳市| 昌乐县| 南雄市| 岑巩县| 富民县| 夏河县| 城步| 科技|