999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Django靜態文件管理機制及最佳使用策略研究

2023-11-14 08:05:46賈文雅尹雪婷白艷明張亮明
現代計算機 2023年17期
關鍵詞:設置

王 祎,賈文雅,尹雪婷,白艷明,張亮明

(1.山西藥科職業學院工商管理系,太原 030031;2.山西藥科職業學院器械工程系,太原 030031;3.山西藥科職業學院電教中心,太原 030031)

0 引言

Django 是一個廣受歡迎的Web 框架,用于開發現代的Web 應用程序。它為開發者提供了許多有用的功能,包括靜態文件管理。雖然靜態文件管理是一項相對簡單的任務,但如果不理解Django 的靜態文件管理機制,可能會導致在使用靜態文件時遇到各種問題。本文將結合項目開發實踐及相關文檔研究,對Django 的靜態文件管理機制進行深入解析,以幫助開發者更好地使用靜態文件,并在此基礎上提出了一種Django 靜態文件的使用策略,實現開發狀態和部署狀態的自由切換。

1 Django靜態文件管理機制概述

Django 在開發狀態(DEBUG=True)和部署狀態(DEBUG=False)下對靜態文件的處理方式有所不同。在開發狀態下,Django 使用django.contrib.staticfiles 進行靜態文件管理,靜態文件可以存放在應用的static 子目錄中,也可以存放在STATICFILES_DIRS 指定的目錄中,Django 會自動掃描并管理這些目錄中的文件。

而在部署狀態下,所有的靜態文件都需要放置到一個單獨的目錄中,再由專業的靜態文件服務器進行管理。開發者需要使用命令將開發狀態下的所有靜態文件收集到該文件夾中,并提供正確的靜態文件路徑給專業的服務器,以便服務器能夠正確地找到并管理這些文件[1]。

2 Django使用靜態文件的一般方式

一般來講,在使用Django 框架建立網站時,可以通過以下步驟來設置使用靜態文件[2]。

第一步:啟用django.contrib.staticfiles

在項目的settings.py文件中找到INSTALLED_APPS 設置項,保持其原有內容不變,在列表的最后加入‘django.contrib.staticfiles’,代碼如下:

一般在創建項目時默認已加入該項,所以通常不需要修改。

第二步:設置訪問靜態文件時使用的基礎URL

在項目的settings.py 文件中找到STATIC_URL(若找不到,則新建一個),將其值設置為‘/staticFiles/’,代碼如下:

其中的‘/staticFiles/’可以修改為你想要使用的任何字符串,最后一個字符必須是斜線‘/’。

第三步:在應用文件夾下建立static文件夾

每一個項目通常都會有多個應用,假設在項目中存在一個名為myapp1 的應用,要實現該應用靜態文件的正確引用,需要在myapp1 目錄下建立static 文件夾,這個文件夾的名稱不可以更改,因為這是Django 默認查找的目錄。靜態文件需要存放在該static 文件夾下。該文件夾下還可以建立子文件夾。

第四步:使用static標簽引用靜態文件

在應用的模板文件中,首先使用{% load static %}導入static 標簽,然后通過{% static“靜態文件相對路徑”%}就可以訪問到需要的靜態文件。

3 應用舉例

下面以圖片為例,演示靜態文件的使用。假設有一個名稱為myWebSite 的Django 項目,該項目有兩個應用myapp1 和myapp2。要實現圖片的正確引用,需要完成以下四個步驟:

第一步:修改項目的設置,編輯myWeb-Site/settings.py文件,在其中加入如下代碼:

這一步中除‘django.contrib.staticfiles’之外,‘myapp1’‘myapp2’也不可少,只有在這里聲明了應用名稱,Django 才會到它們的目錄下去尋找static文件夾。

第二步:編輯myWebSite/settings.py 文件,在其中加入如下代碼:

這一步設定了訪問靜態文件的基礎URL。

第三步:在應用文件夾下建立static 文件夾。建好之后的目錄結構如圖1 所示(隱藏了與靜態文件引用無關的內容)。

圖1 目錄結構示例1

在myapp1 中有一張圖片‘錢學森.jpg’,存放位置是myWebSite/myapp1/static。為了能正常訪問這張圖片,static 文件夾必須要在應用目錄myapp1 之下,且名稱必須是static。類似的,myapp2要用到的靜態文件,需要放置到myWeb-Site/myapp2/static 文件夾之下。若有其它應用,與此類似。

第四步:在模板文件中引用‘錢學森.jpg’,可以通過以下代碼實現:

其中static 標簽對應的是STATIC_URL 的值,{%static“錢學森.jpg”%} 對應的URL是:‘/static-Files/錢學森.jpg’,在模板中直接使用該地址也可以訪問到圖片文件。

Django 將每個應用的static 文件夾下的所有內容都對應到了‘/staticFiles/’這個URL 之下。若以‘python manage.py runserver 127.0.0.1:8000’啟動網站,則在瀏覽器中可以通過‘http://127.0.0.1:8000/staticFiles/錢學森.jpg’來訪問該圖片文件。

4 可能遇到的問題和使用技巧

(1)不使用{%load static%}能否引用圖片?

不使用{% load static %}也能引用圖片,方法如下[3]:

修改settings.py 文件,在其中加入如下代碼,原有代碼保持不變:

以上設置完成之后重啟網站,就可以通過{{STATIC_URL}}來引用STATIC_URL 中的值。在模板中構建靜態文件地址的代碼為:‘{{STATIC_URL}}錢學森.jpg’,其對應的URL為‘/static_url/錢學森.jpg’。

(2)在項目中存在多個應用的時候,有些應用的靜態文件可能會使用相同的名稱,同名靜態文件在引用時出現沖突怎么辦?

是的,同名靜態文件確實會存在沖突。Django 在查找靜態文件時,以先找到者為準,所以如果存在同名文件,返回的地址對應的是首先找到的文件,可能導致文件引用錯誤。

為了解決這個問題,一般采用的方法是,在每個應用的static 文件夾下再以應用名稱建立一個文件夾,該應用的所有的靜態文件都存放在該文件夾下,為了便于使用,一般會以js、css、imgs 等文件夾來區分靜態文件的類型,目錄結構如圖2所示。

圖2 目錄結構示例2

如圖2 所示,在myapp1/static 文件夾下再建立一個myapp1 文件夾,在myapp2/static 文件夾之下再建立一個myapp2 文件夾。這樣在引用myapp1 中的靜態文件‘錢學森.jpg’時,其引用地址是:

而在應用myapp2 中存在的同名文件,其引用地址是:

如此一來,就不會出現地址沖突的問題了。

(3)有一些靜態文件在很多應用中都會用到,放到某一個應用的static 文件夾下好像不太合適,該怎么辦?

可以使用公共靜態文件夾,將公用文件存放在該文件夾下。公共靜態文件夾可以通過STATICFILES_DIRS 進行設定。編輯settings.py文件中,增加如下代碼:

STATICFILES_DIRS=(‘common_static’,)

將公共靜態文件存放到‘common_static’文件夾下即可。這里指定的文件夾可以使用絕對地址,也可以使用相對地址,相對地址是相對項目主目錄的地址。上面的代碼設置的就是一個相對地址。這里可以指定多個文件夾,文件夾名稱可以由用戶自行設定。這里的文件夾可以位于項目文件夾之外。絕對地址一般使用os. path. join(BASE_DIR,‘common_static’)這樣的方式來生成,避免硬編碼,具有更高的可移植性。Django 查找文件的順序是先查找STATICFILES_DIRS 中指定的文件夾,后查找應用下的static文件夾。

對公共靜態文件夾中的文件的引用方式與前面相同。

(4)將settings.py 文件中的‘DEBUG=True’改為‘DEBUG=False’后,靜態文件訪問不了了,該怎么辦?(在部署狀態下如何使用靜態文件?)

在網站開發時我們會將DEBUG 設置為True,以方便錯誤調試;在網站部署時,需要將DEBUG設置為False,以停止顯示詳細錯誤信息,提高網站的安全性。但在將DEBUG 設置為False之后,Django就由開發狀態轉為部署狀態,其不再自動支持對靜態文件的訪問。此時需要使用第三方文件服務器提供靜態文件服務。

開發者需要在settings.py 文件中設定STATIC_ROOT參數,代碼如下:

設定之后,運行python manage.py collectstatic 命令,它會將所有的靜態文件收集到staticRoot 文件夾之下。staticRoot 文件夾的名稱可以由用戶自定義,收集命令會自動建立該文件夾。該文件夾地址可以是絕對地址,也可以是相對地址,相對地址是相對項目主目錄的地址。該文件夾可以位于項目目錄之外。

因為Django 的靜態文件服務在效率和安全性方面不夠成熟,不建議在部署時使用。需要改為使用其它專業的靜態文件服務器,一般比較常用的是Nginx。在靜態文件服務器軟件中將根目錄設置為STATIC_ROOT指定的目錄即可。

不使用第三方靜態文件服務器,而是用Django 自身也可以在部署狀態下提供靜態文件服務,詳見后文。

(5)不使用django.contrib.staticfiles 能否訪問靜態文件?

可以。以下方法適用于開發狀態。

首先在settings.py 中設置DEBUG=True,然后將所有的靜態文件存放在STATIC_ROOT 指定的文件夾中,最后修改項目的根路由文件urls.py,代碼如下:

該方法只有技術上的可行性,并沒有實用價值,因為在方便性上它不如‘staticfiles’,并且也僅適用于開發狀態,列出僅供參考。

(6)STATIC_URL 設置為‘static/’和‘/static/’有何區別?

如果STATIC_URL 設置為‘static/’,那么它將以服務器提供的SCRIPT_NAME 的值為前綴,如果服務器沒有設置SCRIPT_NAME,則以‘/’為前綴,最終STATIC_URL 值為‘/static/’。因此,若服務器沒有提供SCRIPT_NAME 的話,這兩種設置的結果是一樣的。如果沒有特別的需要,為避免不確定性,建議設置為‘/static/’。

5 靜態文件最佳使用策略

Django 在開發狀態和部署狀態使用了不同的方式來處理靜態文件,增加了復雜性。開發者開發過程中經常需要在開發狀態和部署狀態之間進行切換,此時可能需要反復進行靜態文件的收集操作,否則可能導致有些靜態文件無法正確顯示。有沒有一種方法可以避免這種反復的收集操作呢?

有!由于‘django.contrib.staticfiles’在由開發狀態轉為部署狀態后,不再提供靜態文件服務。所以我們要放棄使用它,轉而通過手動設置提供靜態文件服務,從而實現開發狀態和部署狀態的自由切換。具體實現步驟如下:

第一步:修改項目設置文件settings.py,刪除‘django. contrib. staticfiles’和STATICFILES_DIRS,設置STATIC_URL=‘/static/’,STATIC_ROOT=‘staticRoot’。

這一步停止了‘django.contrib.staticfiles’對靜態文件的自動管理,并將靜態文件的文件夾設定為項目根文件夾下的‘staticRoot’文件夾。

第二步:在項目根路由文件urls.py 中增加以下代碼[4]:

以上代碼設置了對‘staticRoot’目錄下的所有文件的訪問路由。使這些文件可以被正常訪問到。

這些代碼放在根路由文件的末尾,在項目真正需要部署的時候將其注釋掉即可。

第三步:由于不再使用‘django.contrib.staticfiles’管理靜態文件,所以也不能再使用應用下的static 文件夾和公共靜態文件夾存放靜態文件。而是必須把所有的靜態文件統一放置到一個文件夾下。在第一步中我們設置了STATIC_ROOT=‘staticRoot’,是一個相對于項目根目錄的路徑,所以需要在項目根文件夾下建立static-Root文件夾,在其中建立應用文件夾和分類文件夾以便于管理靜態文件,目錄結構如圖3所示。

圖3 目錄結構示例3

第四步在模板文件中使用如下代碼進行圖片文件引用:

使用這種方式,我們在開發狀態和部署狀態之間進行切換時,靜態文件均可以正常顯示,不需要進行其他處理,對于網站開發過程中的運行測試提供了極大的便利。

但在網站正式部署的時候,還是需要使用專業的文件服務器來管理靜態文件,以保證效率和安全性。這時需要將第二步中跟路由文件urls.py 中增加的代碼刪除或注釋掉,其它代碼無需修改。

6 關于上傳文件的使用

上傳文件也屬于靜態文件,Django 對它們的管理方式和以上方式類似。這里僅探討File-Field 字段對應的文件的上傳方式。要實現文件的正確上傳,僅需在settings.py 文件中增加以下一條語句:

該文件夾地址可以是絕對地址,也可以是相對地址,相對地址是相對項目主目錄的地址。該文件夾可以位于項目目錄之外。這里設置的是相對地址,因此需要在項目根目錄下建立uploadFiles 文件夾。之后使用Django 提供的admin管理頁面就可以正常上傳文件了。

如果要訪問已上傳的文件,需要設置MEDIA_URL 和添加已上傳文件的路由。首先編輯settings.py文件,增加以下語句:

接著修改項目的根路由文件urls.py,在其中添加以下語句:

之后就可以實現對已上傳文件的正常訪問。這種方式同時適用于開發狀態和部署狀態,在兩種狀態之間切換時不需要進行其它修改。同樣建議在項目正式部署時,改為由其它正式的靜態文件服務器提供服務,同時將該條語句注釋或刪除。

7 結語

本文對Django 靜態文件管理機制進行了較為全面的解析,在此基礎上使用手動配置文件服務和單一文件夾管理靜態文件的方式,實現了Django 項目靜態文件管理的優化,使開發者在進行網站開發測試時不需要手動進行靜態文件的收集操作及其他文件服務器的配置,簡化了開發者的操作,提高了Django 網站開發測試的便利性和工作效率。

猜你喜歡
設置
中隊崗位該如何設置
少先隊活動(2021年4期)2021-07-23 01:46:22
船舶防火結構及設置的缺陷與整改
水上消防(2020年5期)2020-12-14 07:16:18
中外醫學專業與專科設置對比分析及啟示
特殊場景下列控等級轉換的設置方案
7招教你手動設置參數
動車段(所)股道有效長設置研究
我國中小學將設置人工智能相關課程
玩具世界(2017年9期)2017-11-24 05:17:29
吃紙的妖怪
本刊欄目設置說明
中俄臨床醫學專業課程設置的比較與思考
主站蜘蛛池模板: 99久久精品国产综合婷婷| 国产无遮挡猛进猛出免费软件| 国产网友愉拍精品视频| 久久动漫精品| 波多野结衣无码AV在线| 91精品小视频| 91成人免费观看| 自拍偷拍欧美| 女同国产精品一区二区| 日韩无码黄色网站| 美女黄网十八禁免费看| 色综合网址| 亚洲男人天堂久久| 日本不卡在线视频| 欧美色视频在线| 亚洲精品在线观看91| 3344在线观看无码| 亚洲精品亚洲人成在线| 免费高清毛片| 国产成人亚洲欧美激情| 国产视频 第一页| 国产亚洲视频播放9000| 重口调教一区二区视频| 国产精品主播| 熟妇人妻无乱码中文字幕真矢织江| 欧美亚洲国产精品久久蜜芽| 中文字幕资源站| 99免费视频观看| 亚洲男人天堂网址| 国产成人做受免费视频| 在线播放真实国产乱子伦| 欧美精品一二三区| 人人艹人人爽| 国产精品自在线天天看片| 青草视频久久| 狠狠五月天中文字幕| 日韩高清中文字幕| 国产欧美日韩综合一区在线播放| 日韩AV无码免费一二三区| 久久毛片基地| 99re免费视频| 成年女人a毛片免费视频| 2019年国产精品自拍不卡| 青青久久91| 免费一级毛片| 韩日午夜在线资源一区二区| 2018日日摸夜夜添狠狠躁| 热伊人99re久久精品最新地| 国产香蕉97碰碰视频VA碰碰看| 狠狠亚洲婷婷综合色香| 亚洲精品另类| 亚洲国产成人在线| 毛片基地视频| 午夜一区二区三区| 亚洲婷婷丁香| 一级毛片无毒不卡直接观看| 美女视频黄频a免费高清不卡| 亚洲a级在线观看| 青青青国产视频手机| 一级一毛片a级毛片| 亚洲AV无码不卡无码| 国产女人水多毛片18| 天堂av高清一区二区三区| 亚洲人成网站观看在线观看| 多人乱p欧美在线观看| 成人午夜精品一级毛片| 18禁高潮出水呻吟娇喘蜜芽| 国产大全韩国亚洲一区二区三区| 国产一级做美女做受视频| 亚洲一级毛片免费看| a在线亚洲男人的天堂试看| 色有码无码视频| 色老头综合网| 国产成人精品一区二区| 97国产精品视频人人做人人爱| 久久精品嫩草研究院| 国产av一码二码三码无码| 91视频青青草| 亚洲av无码成人专区| 日韩黄色大片免费看| 日韩欧美一区在线观看| 在线观看国产精美视频|