Django debug為True時(shí),css加載失敗的解決方案
django上線后,需要把setting.py文件的debug=True改為False,以防暴露代碼報(bào)錯(cuò)問題。
因?yàn)槲翼?xiàng)目用到css的地方只有admin管理員登陸這塊,沒有自定義的css等,所以我的css文件夾名稱定義成static
1.更改setting.py文件
STATIC_URL=‘/static/‘ STATIC_ROOT=os.path.join(BASE_DIR,'../static/')
STATIC_URL是css的加載路徑,項(xiàng)目中如果用到了css的地方,會(huì)沿著該路徑尋找這個(gè)路徑下的css文件
STATIC_ROOT是存放所有的static文件,運(yùn)行 python manage.py collectionstatic命令后,python會(huì)自動(dòng)檢索項(xiàng)目所有的目錄,把static文件夾拷貝到STATIC_ROOT目錄下。在部署的時(shí)候會(huì)用到。
2.執(zhí)行下述命令
將所有的所有app下(包括Django自帶的)static目錄下的文件復(fù)制到STATIC_ROOT目錄下
python manage.py collectionstatic
3.修改nginx配置文件
添加下述代碼到nginx配置文件中
location /static { alias /Users/admin/PythonProject/static; break; }
server結(jié)果如下
server{ listen 8011; server_name localhost; rewrite ^/$/ break; location /static { alias /Users/admin/PythonProject/static; break; } location /{ proxy_pass http://127.0.0.1:8000; } }
作用如下:當(dāng)一個(gè)請(qǐng)求(例如,登陸請(qǐng)求 http://127.0.0.1:8011/admin/)通過nginx轉(zhuǎn)發(fā)時(shí),會(huì)首先到下面的location中,被轉(zhuǎn)發(fā)到8000端口,調(diào)用Django項(xiàng)目中的admin登陸接口,登陸接口里面會(huì)請(qǐng)求兩個(gè)css文件,分別是
http://127.0.0.1:8011/static/admin/css/login.css
http://127.0.0.1:8011/static/admin/css/base.css
這兩個(gè)請(qǐng)求被上面的nginx配置中的第一個(gè)location匹配到,并且使用alias路徑替換location路徑,找到login.css文件和base.css文件。
(注意:location后面配置的路徑,如果是以 / 結(jié)尾,那么匹配后的路徑將不會(huì)帶匹配中的字段,不帶 / 結(jié)尾,將會(huì)帶著匹配中的字段,詳細(xì)的就不再贅述了)
這樣,css文件就會(huì)被正確的加載上了。
補(bǔ)充:Django項(xiàng)目關(guān)閉debug模式后,靜態(tài)文件無法加載的解決辦法
近期在做OpenStack Horizon項(xiàng)目的相關(guān)開發(fā),OpenStack的整體環(huán)境使用DevStack安裝,horizon開發(fā)過程中直接使用命令:
python manager.py runserver
開啟內(nèi)置服務(wù)器,由于項(xiàng)目中l(wèi)ocal_settings.py文件中的DEBUG=True,進(jìn)行開發(fā)和調(diào)試一直沒什么問題。
但是現(xiàn)在需要編寫404,500等出錯(cuò)頁(yè)面,在debug模式下出了錯(cuò)都會(huì)出現(xiàn)報(bào)錯(cuò)頁(yè)面,無法轉(zhuǎn)向到404或500頁(yè)面,這時(shí)我將local_settings.py中的DEBUG設(shè)為false,這時(shí)候應(yīng)該可以轉(zhuǎn)向到404頁(yè)面。
實(shí)驗(yàn)證明確實(shí)如此,404和500頁(yè)面都可以得到,但是出現(xiàn)了新的問題:css和js文件無法加載。
在網(wǎng)上找了找,很快就找到了問題的原因:
Django框架僅在開發(fā)模式下提供靜態(tài)文件服務(wù)。
當(dāng)我開啟DEBUG模式時(shí),Django內(nèi)置的服務(wù)器是提供靜態(tài)文件的服務(wù)的,所以css等文件訪問都沒有問題,但是關(guān)閉DEBUG模式后,Django便不提供靜態(tài)文件服務(wù)了。
想一想這是符合Django的哲學(xué)的:這部分事情標(biāo)準(zhǔn)服務(wù)器都很擅長(zhǎng),就讓服務(wù)器去做吧!
OK,解決問題的辦法也就出現(xiàn)了,我最開始想到的就是,使用項(xiàng)目正式部署是所使用的配置,由apache提供靜態(tài)文件服務(wù)。不過解決問題的方法遠(yuǎn)不止一種,在stackoverflow上我發(fā)現(xiàn)了更有趣的方法。
現(xiàn)在把自己總結(jié)的四種方法列在下面,共大家參考:
1.將靜態(tài)文件由apache提供文件服務(wù)(類似正式部署):
編輯/etc/apache2/sites-available/horizon文件:
#Alias /media /opt/stack/horizon/openstack_dashboard/static Alias /static /opt/stack/horizon/openstack_dashboard/static
建立靜態(tài)文件鏈接:
ln -sv /opt/stack/horizon/openstack_dashboard/static /opt/stack/horizon
重啟apache:
sudo service apache2 restart
2.使用django.views.static.serve()方法
在URLconf中添加:
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': '/path/to/media'}),
官方文檔中評(píng)價(jià)這種辦法:“The big, fat disclaimer”。
3.偽造404頁(yè)面:
使用正確的URL鏈接404頁(yè)面模板;
4.改變項(xiàng)目運(yùn)行方式:
python manage.py runserver --insecure
最后這種是stackoverflow上最受歡迎的方法,確實(shí)簡(jiǎn)單快捷!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Flask實(shí)現(xiàn)異步執(zhí)行任務(wù)
在一些開發(fā)中,可能會(huì)遇到需要長(zhǎng)時(shí)間處理的任務(wù),此時(shí)就需要使用異步的方式來實(shí)現(xiàn),本文就介紹了Flask實(shí)現(xiàn)異步執(zhí)行任務(wù)的方法,感興趣的可以了解一下2021-05-05Python開發(fā)的單詞頻率統(tǒng)計(jì)工具wordsworth使用方法
wordsworth是字母,單詞和n元組頻率分析,用來分析文件中的單詞出現(xiàn)頻率的工具。2014-06-06Python實(shí)現(xiàn)ElGamal加密算法的示例代碼
ElGamal加密算法是一個(gè)基于迪菲-赫爾曼密鑰交換的非對(duì)稱加密算法。這篇文章通過示例代碼給大家介紹Python實(shí)現(xiàn)ElGamal加密算法的相關(guān)知識(shí),感興趣的朋友一起看看吧2020-06-06pytorch: tensor類型的構(gòu)建與相互轉(zhuǎn)換實(shí)例
今天小編就為大家分享一篇pytorch: tensor類型的構(gòu)建與相互轉(zhuǎn)換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07詳解python __init__.py 和 __all__作用
導(dǎo)入文件夾包的時(shí)候,會(huì)運(yùn)行寫在該文件夾包下的__init__.py文件,這主要是__init__.py的作用,本文結(jié)合示例代碼介紹了python __init__.py 和 __all__作用,感興趣的朋友一起看看吧2023-02-02Python?PaddleGAN實(shí)現(xiàn)照片人物性別反轉(zhuǎn)
PaddleGAN中的styleganv2editing.py是支持性別編輯的。所以本文將介紹如何通過調(diào)整參數(shù),來試著實(shí)現(xiàn)一下照片的性別翻轉(zhuǎn)。感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12關(guān)于python并發(fā)編程中的協(xié)程
協(xié)程是一種輕量級(jí)的并發(fā)方式,它是在用戶空間中實(shí)現(xiàn)的,并不依賴于操作系統(tǒng)的調(diào)度,協(xié)程可以在同一個(gè)線程中實(shí)現(xiàn)并發(fā),不需要進(jìn)行上下文切換,因此執(zhí)行效率非常高,需要的朋友可以參考下2023-04-04python基于opencv實(shí)現(xiàn)人臉識(shí)別
這篇文章主要介紹了python基于opencv實(shí)現(xiàn)人臉識(shí)別的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01淺談Python中的異常和JSON讀寫數(shù)據(jù)的實(shí)現(xiàn)
今天小編就為大家分享一篇淺談Python中的異常和JSON讀寫數(shù)據(jù)的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python3實(shí)現(xiàn)爬蟲爬取趕集網(wǎng)列表功能【基于request和BeautifulSoup模塊】
這篇文章主要介紹了Python3實(shí)現(xiàn)爬蟲爬取趕集網(wǎng)列表功能,結(jié)合實(shí)例形式分析了Python3基于request和BeautifulSoup模塊的網(wǎng)站頁(yè)面爬取相關(guān)操作技巧,需要的朋友可以參考下2018-12-12