下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Django實(shí)現(xiàn)靜態(tài)文件緩存到云服務(wù)的操作方法一般與頁(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ā)到客戶端。我們后臺(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)文件以及需要的依賴,例如Django和python自己需要的靜態(tài)文件等打包到一個(gè)統(tǒng)一的目錄下。這有點(diǎn)類(lèi)似于maven發(fā)布前的打包功能。
這個(gè)腳本一般在上線的時(shí)候會(huì)執(zhí)行。例如我們的啟動(dòng)腳本里這么寫(xiě)的:
shcollectstatic.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
classCosStorage(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):
('initcosfilelist...')
self.get_cos_file_list()
#看看這里是否需要
def_open(self,name,mode='r'):
returnFile(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.訪問(wèn)時(shí)是如何重定向到cos的
將文件存到云服務(wù)之后,頁(yè)面執(zhí)行的時(shí)候怎么訪問(wèn)呢?
這就涉及到Storage的其他幾個(gè)方法了,主要是:
deflistdir(self,path):
pass
defdelete(self,name):
pass
defsize(self,name):
pass
defurl(self,name):
url=cms.util.get_file_os_download_url(name)
returnurl
defexists(self,name):
pass
上面看名字我們就能大致知道功能,最重要的是url()方法,這個(gè)是理解Storage的第二把鑰匙。
這里的name就是文件在云服務(wù)中的相對(duì)路徑,你需要將拼接一下你的域名等就是文件的地址了。然后返回就行了。
如果靜態(tài)文件都是公開(kāi)的,這里的url貌似不寫(xiě)也行,能夠自動(dòng)實(shí)現(xiàn)將域名和文件相對(duì)路徑拼接程完整的訪問(wèn)url。
但是在我們的系統(tǒng)中,靜態(tài)文件是不允許直接訪問(wèn),需要帶簽名的。所以我們這里需要在url里通過(guò)自定義的get_file_os_download_url()方法去訪問(wèn)我們另外一個(gè)服務(wù)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 西餐中級(jí)等級(jí)考試題及答案
- 2025年保育員初級(jí)考試試題試題及答案
- 榆社事業(yè)編招聘2020年考試真題及答案解析【考試版】
- 基礎(chǔ)化工知識(shí)問(wèn)答試題及答案
- 2025-2030葡萄牙葡萄酒地理標(biāo)志產(chǎn)品保護(hù)及品牌競(jìng)爭(zhēng)力提升鏈規(guī)劃分析研究報(bào)告
- 安全員A證考試考前沖刺試卷附參考答案詳解(能力提升)
- 岳陽(yáng)2025年湖南岳陽(yáng)市君山區(qū)部分事業(yè)單位選調(diào)3人筆試歷年參考題庫(kù)附帶答案詳解
- 宿遷江蘇宿遷泗洪縣面向2025年普通高校應(yīng)屆本科及以上畢業(yè)生招聘教師80人筆試歷年參考題庫(kù)附帶答案詳解
- 職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)及參考答案詳解【綜合題】
- 寧波2025年浙江寧波市衛(wèi)生健康委員會(huì)直屬事業(yè)單位招聘30人(第三批)筆試歷年參考題庫(kù)附帶答案詳解
- 2025中證信息技術(shù)服務(wù)有限責(zé)任公司招聘16人筆試參考題庫(kù)附答案
- 建筑工程決算編制標(biāo)準(zhǔn)及實(shí)例
- 安徽省江淮十校2025年高二數(shù)學(xué)第一學(xué)期期末質(zhì)量檢測(cè)試題含解析
- 電力工程項(xiàng)目預(yù)算審核流程
- GB/T 14748-2025兒童呵護(hù)用品安全兒童推車(chē)
- 蒸汽管道-應(yīng)急預(yù)案
- 疊合板專(zhuān)項(xiàng)施工方案(完整版)
- 造價(jià)咨詢溝通和協(xié)調(diào)方案(3篇)
- 耐蝕襯膠工專(zhuān)項(xiàng)考核試卷及答案
- 水利工程單元工程施工質(zhì)量驗(yàn)收常用表格(建筑工程)單元工程施工質(zhì)量驗(yàn)收表
- 地源熱泵工程施工方案
評(píng)論
0/150
提交評(píng)論