婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Django實現(xiàn)靜態(tài)文件緩存到云服務(wù)的操作方法

Django實現(xiàn)靜態(tài)文件緩存到云服務(wù)的操作方法

熱門標(biāo)簽:長沙高頻外呼系統(tǒng)原理是什么 ai電話機(jī)器人哪里好 地圖標(biāo)注審核表 宿遷星美防封電銷卡 湛江智能外呼系統(tǒng)廠家 外呼并發(fā)線路 百度地圖標(biāo)注沒有了 西藏房產(chǎn)智能外呼系統(tǒng)要多少錢 ai電銷機(jī)器人源碼

一般與頁面有關(guān)的系統(tǒng)都會有大量的靜態(tài)文件,包括js、css以及圖標(biāo)圖片等,這些文件一般是項目的相對路徑,在加載的時候會從本地讀取再轉(zhuǎn)發(fā)出去。由于這類文件一般比較大,導(dǎo)致接口響應(yīng)變長,但是這些文件一般很少改動,所以非常適合通過Nginx或者云服務(wù)來緩存。一般云服務(wù)與cdn無縫集成,能夠更快下發(fā)到客戶端。我們后臺系統(tǒng)很多使用的是基于python的Django框架,該怎么來實現(xiàn)靜態(tài)文件緩存呢?

這個過程簡單的讓人驚訝,但是開始一直搞不清楚關(guān)系,前前后后耽誤了不少時間。

1.collectstatic命令

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

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

sh collectstatic.sh

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

static-map = /static=./static_files

我們將本地的靜態(tài)文件打包發(fā)送到云服務(wù)就是用collectstatic來實現(xiàn)的。

2.如何發(fā)布到云服務(wù)

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

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

@deconstructible
class CosStorage(Storage):

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

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

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

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__自然是為了初始化而設(shè)置的。根據(jù)需要寫對應(yīng)的代碼,例如調(diào)用云服務(wù)需要的簽名等等

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

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

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

content的含義:content就是文件的內(nèi)容,不管是js、css、還是圖標(biāo)圖片,在網(wǎng)絡(luò)傳的時候都會先轉(zhuǎn)換成字節(jié)流是不是。這里的content就是當(dāng)前文件的字節(jié)流。所以就使用upload_os_file(content) 就將文件內(nèi)容發(fā)出去了,不需要自己再讀文件 ,轉(zhuǎn)換成字節(jié)流等操作。不過這里的upload_os_file是我自己的業(yè)務(wù)代碼,你可以根據(jù)需要做對應(yīng)的實現(xiàn)。

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

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

time.sleep(0.02)

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

STATICFILES_STORAGE = 'cos.cos_storage.CosStorage'

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

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

這就涉及到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就是文件在云服務(wù)中的相對路徑,你需要將拼接一下你的域名等就是文件的地址了。然后返回就行了。

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

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

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

該怎么攔截,至今沒有解決,如果你知道,請和我說,謝謝!

到此這篇關(guān)于Django實現(xiàn)靜態(tài)文件緩存到云服務(wù)的操作方法的文章就介紹到這了,更多相關(guān)Django靜態(tài)文件緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Django靜態(tài)文件加載失敗解決方案
  • 快速解決Django關(guān)閉Debug模式無法加載media圖片與static靜態(tài)文件
  • Django添加bootstrap框架時無法加載靜態(tài)文件的解決方式
  • django配置app中的靜態(tài)文件步驟
  • 如何分離django中的媒體、靜態(tài)文件和網(wǎng)頁
  • Django零基礎(chǔ)入門之靜態(tài)文件的引用

標(biāo)簽:寧夏 盤錦 普洱 林芝 漯河 海南 大同 南平

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Django實現(xiàn)靜態(tài)文件緩存到云服務(wù)的操作方法》,本文關(guān)鍵詞  Django,實現(xiàn),靜態(tài),文件,緩存,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Django實現(xiàn)靜態(tài)文件緩存到云服務(wù)的操作方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于Django實現(xiàn)靜態(tài)文件緩存到云服務(wù)的操作方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 石楼县| 定结县| 家居| 佛教| 即墨市| 西吉县| 江津市| 宁强县| 顺平县| 平果县| 吴忠市| 中卫市| 宁明县| 吴桥县| 沙坪坝区| 阿鲁科尔沁旗| 长泰县| 高阳县| 象山县| 阿坝| 长宁区| 黄浦区| 穆棱市| 永丰县| 翼城县| 沂水县| 玉环县| 习水县| 双辽市| 江油市| 连平县| 德钦县| 宁明县| 乌海市| 桐乡市| 新绛县| 盐山县| 根河市| 滨海县| 简阳市| 江山市|