欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年08月17日 14:20:09   作者:縱橫千里,捭闔四方  
這篇文章主要介紹了Django實(shí)現(xiàn)靜態(tài)文件緩存到云服務(wù)的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

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

1.collectstatic命令

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

這個(gè)腳本一般在上線(xiàn)的時(shí)候會(huì)執(zhí)行。例如我們的啟動(dòng)腳本里這么寫(xiě)的:

sh collectstatic.sh

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

static-map = /static=./static_files

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

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

方法非常簡(jiǎn)單,代碼也非常少,但是貌似很多地方都沒(méi)說(shuō)清楚為什么,害的我搞了好久,白了很多垃圾代碼。

首先你要新建一個(gè)繼承了Storage的類(lèi),例如這樣子:

@deconstructible
class CosStorage(Storage):

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

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

以_開(kāi)頭的方法最重要的是下面這三個(gè):

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ù)需要寫(xiě)對(duì)應(yīng)的代碼,例如調(diào)用云服務(wù)需要的簽名等等

_open()這個(gè)我當(dāng)時(shí)忘了測(cè)試一下有沒(méi)有用了,按道理這里是打開(kāi)文件的,反正我是上么這么寫(xiě)的。

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

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

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

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

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

time.sleep(0.02)

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

STATICFILES_STORAGE = 'cos.cos_storage.CosStorage'

3.訪(fǎng)問(wèn)時(shí)是如何重定向到cos的

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

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

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()方法,這個(gè)是理解Storage的第二把鑰匙。

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

如果靜態(tài)文件都是公開(kāi)的,這里的url貌似不寫(xiě)也行,能夠自動(dòng)實(shí)現(xiàn)將域名和文件相對(duì)路徑拼接程完整的訪(fǎng)問(wèn)url。

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

但是這里有一個(gè)坑,就是python的基礎(chǔ)包中也會(huì)用相對(duì)路徑訪(fǎng)問(wèn)自己的靜態(tài)文件,也就是這么寫(xiě)"/title.png"等,這種情況無(wú)法被url攔截到。因?yàn)槲覀儤I(yè)務(wù)的代碼里是統(tǒng)一加前綴/static/的。

該怎么攔截,至今沒(méi)有解決,如果你知道,請(qǐng)和我說(shuō),謝謝!

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

相關(guān)文章

  • Python語(yǔ)言中的if語(yǔ)句詳情

    Python語(yǔ)言中的if語(yǔ)句詳情

    這篇文章主要介紹了Python語(yǔ)言中的if語(yǔ)句詳情,每條if語(yǔ)句的核心都是一個(gè)值為T(mén)rue或False的表達(dá)式,這種表達(dá)式被稱(chēng)為條件測(cè)試,下面文章介紹python語(yǔ)言的if語(yǔ)句詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02
  • python入門(mén)之基礎(chǔ)語(yǔ)法學(xué)習(xí)筆記

    python入門(mén)之基礎(chǔ)語(yǔ)法學(xué)習(xí)筆記

    學(xué)習(xí)python過(guò)程中需要了解的一些基礎(chǔ)語(yǔ)法特整理一下方便更開(kāi)始接觸python的朋友
    2020-02-02
  • Python面向?qū)ο蟪绦蛟O(shè)計(jì)之繼承與多繼承用法分析

    Python面向?qū)ο蟪绦蛟O(shè)計(jì)之繼承與多繼承用法分析

    這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)之繼承與多繼承用法,結(jié)合實(shí)例形式分析了Python繼承與多繼承的簡(jiǎn)單定義與使用方法,需要的朋友可以參考下
    2018-07-07
  • Django重裝mysql后啟動(dòng)報(bào)錯(cuò):No module named ‘MySQLdb’的解決方法

    Django重裝mysql后啟動(dòng)報(bào)錯(cuò):No module named ‘MySQLdb’的解決方法

    這篇文章主要給大家介紹了關(guān)于Django重裝mysql后啟動(dòng)報(bào)錯(cuò):No module named ‘MySQLdb’的解決方法,分享出來(lái),對(duì)同樣遇到這個(gè)問(wèn)題的朋友們一個(gè)參考學(xué)習(xí),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • 使用python requests模塊發(fā)送http請(qǐng)求及接收響應(yīng)的方法

    使用python requests模塊發(fā)送http請(qǐng)求及接收響應(yīng)的方法

    用 python 編寫(xiě) http request 消息代碼時(shí),建議用requests庫(kù),因?yàn)閞equests比urllib內(nèi)置庫(kù)更為簡(jiǎn)捷,requests可以直接構(gòu)造get,post請(qǐng)求并發(fā)送,本文給大家介紹了使用python requests模塊發(fā)送http請(qǐng)求及接收響應(yīng)的方法,需要的朋友可以參考下
    2024-03-03
  • Python實(shí)現(xiàn)Word文檔樣式批量處理

    Python實(shí)現(xiàn)Word文檔樣式批量處理

    這篇文章主要為大家詳細(xì)介紹了如何利用Python中的python-docx非標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)word文檔樣式批量處理,文中示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-05-05
  • PyTorch中torch.nn模塊的實(shí)現(xiàn)

    PyTorch中torch.nn模塊的實(shí)現(xiàn)

    torch.nn是PyTorch中用于構(gòu)建神經(jīng)網(wǎng)絡(luò)的核心模塊,包括多種組件,每個(gè)組件都有其特定的原理和使用場(chǎng)景,本文就來(lái)詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2024-09-09
  • 一起來(lái)學(xué)習(xí)Python的元組和列表

    一起來(lái)學(xué)習(xí)Python的元組和列表

    這篇文章主要為大家詳細(xì)介紹了Python元組和列表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Python基于數(shù)列實(shí)現(xiàn)購(gòu)物車(chē)程序過(guò)程詳解

    Python基于數(shù)列實(shí)現(xiàn)購(gòu)物車(chē)程序過(guò)程詳解

    這篇文章主要介紹了Python基于數(shù)列實(shí)現(xiàn)購(gòu)物車(chē)程序過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • python學(xué)習(xí)教程之使用py2exe打包

    python學(xué)習(xí)教程之使用py2exe打包

    py2exe是一個(gè)將python腳本轉(zhuǎn)換成windows上的可獨(dú)立執(zhí)行的可執(zhí)行程序(*.exe)的工具,下面這篇文章主要給大家介紹了關(guān)于python學(xué)習(xí)教程之使用py2exe打包的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09

最新評(píng)論