解決Django生產(chǎn)環(huán)境無(wú)法加載靜態(tài)文件問(wèn)題的解決
起步
線上部署時(shí)因設(shè)置了 settings.DEBUG = False 會(huì)導(dǎo)致靜態(tài)文件都是 404 的情況。主要原因是應(yīng)為關(guān)閉DEBUG模式后,Django 便不提供靜態(tài)文件服務(wù)了。
runserver 的啟動(dòng)
如果運(yùn)行是通過(guò) runserver 命令的方式,那簡(jiǎn)單,在啟動(dòng) runserver 指令后追加 --insecure 選項(xiàng)能參數(shù)強(qiáng)制 django 處理靜態(tài)文件。
其他方式啟動(dòng)
但如果是通過(guò) uwsgi 或 daphne 等啟動(dòng)的話,追加選項(xiàng)的方式就不管用了。要解決這個(gè)問(wèn)題,我們要手動(dòng)去使用靜態(tài)文件服務(wù),這種處理方式是比較推薦的,因?yàn)樗瑫r(shí)也支持了 runserver 的方式。
解決的方式如下,在 urls.py 中添加 url 規(guī)則:
from django.contrib.staticfiles.views import serve from django.urls import re_path def return_static(request, path, insecure=True, **kwargs): return serve(request, path, insecure, **kwargs) urlpatterns = [ ... re_path(r'^static/(?P<path>.*)$', return_static, name='static'), # 添加這行 ]
這樣就行了。
為什么這樣就能解決了?
需要去做靜態(tài)文件的路由匹配,但重點(diǎn)是這里多了個(gè)函數(shù) return_static 去代理了 serve ,如果你稍微看下 serve 函數(shù)的代碼就立馬理解了:
def serve(request, path, insecure=False, **kwargs): if not settings.DEBUG and not insecure: raise Http404
默認(rèn)情況下 insecure=False ,并且在關(guān)閉調(diào)試模式后都是 404。通過(guò)寫個(gè) return_static 函數(shù)其實(shí)與 --insecure 的選項(xiàng)是異曲同工的。
媒體文件的處理
媒體文件的處理當(dāng)然可以將上面 url 規(guī)則變動(dòng)下就能加載了。如果用上面的方法來(lái)處理媒體文件可以得 90 分,那么下面的方法可以得 95 分。
上面的方法會(huì)搜索多個(gè)目錄的,盡管開發(fā)人員會(huì)將靜態(tài)文件同一放目錄下。但 Django 的 admin 模塊的靜態(tài)文件存放在其他地方的。
而媒體文件,我們只會(huì)限定在一個(gè)目錄的,所以更好的處理方法是只在一個(gè)目錄下搜索:
from django.views.static import serve as static_serve # 注意這里引入的與上面的不同 from django.urls import re_path urlpatterns = [ ... re_path(r'^media/(?P<path>.*)$' , static_serve, { 'document_root' : settings.MEDIA_ROOT}), ]
另外,如果網(wǎng)站的所有靜態(tài)文件都只會(huì)在一個(gè)目錄下(使用 collectstatic 能將所有靜態(tài)文件都復(fù)制到一個(gè)目錄),那么也請(qǐng)用這個(gè) static_serve 方式去處理靜態(tài)文件,我們希望我們的程序是精益求精的良品。
總結(jié)
另外還有通過(guò)第三方程序來(lái)處理靜態(tài)文件,比如 nginx 設(shè)置 alias 等。但顯然我更希望是程序自身的處理方式。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Django+Uwsgi+Nginx如何實(shí)現(xiàn)生產(chǎn)環(huán)境部署
- Django 開發(fā)環(huán)境與生產(chǎn)環(huán)境的區(qū)分詳解
- Django uwsgi Nginx 的生產(chǎn)環(huán)境部署詳解
- 詳解Django+Uwsgi+Nginx 實(shí)現(xiàn)生產(chǎn)環(huán)境部署
- 詳解Django+Uwsgi+Nginx的生產(chǎn)環(huán)境部署
- Django + Uwsgi + Nginx 實(shí)現(xiàn)生產(chǎn)環(huán)境部署的方法
- django生產(chǎn)環(huán)境搭建(uWSGI+django+nginx+python+MySQL)
相關(guān)文章
python中redis查看剩余過(guò)期時(shí)間及用正則通配符批量刪除key的方法
這篇文章主要介紹了python中redis查看剩余過(guò)期時(shí)間及用正則通配符批量刪除key的方法,需要的朋友可以參考下2018-07-07Matplotlib實(shí)戰(zhàn)之直方圖繪制詳解
直方圖,又稱質(zhì)量分布圖,用于表示數(shù)據(jù)的分布情況,是一種常見的統(tǒng)計(jì)圖表,這篇文章主要為大家詳細(xì)介紹了如何使用Matplotlib繪制直方圖,需要的可以參考下2023-08-08python如何寫入dbf文件內(nèi)容及創(chuàng)建dbf文件
這篇文章主要介紹了python如何寫入dbf文件內(nèi)容及創(chuàng)建dbf文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08PyTorch詳解經(jīng)典網(wǎng)絡(luò)種含并行連結(jié)的網(wǎng)絡(luò)GoogLeNet實(shí)現(xiàn)流程
今天小編就為大家分享一篇Pytorch實(shí)現(xiàn)GoogLeNet的方法,GoogLeNet提出了一個(gè)名為“Inception”的深度卷積神經(jīng)網(wǎng)結(jié)構(gòu),其目標(biāo)是將分類、識(shí)別ILSVRC14數(shù)據(jù)集的技術(shù)水平提高一個(gè)層次。這一結(jié)構(gòu)的主要特征是對(duì)網(wǎng)絡(luò)內(nèi)部計(jì)算資源的利用進(jìn)行了優(yōu)化2022-05-05Django項(xiàng)目定期自動(dòng)清除過(guò)期session的2種方法實(shí)例
如果用戶主動(dòng)退出,session會(huì)自動(dòng)清除,如果沒有退出就一直保留,記錄數(shù)越來(lái)越大,要定時(shí)清理沒用的session,下面這篇文章主要給大家介紹了關(guān)于Django項(xiàng)目定期自動(dòng)清除過(guò)期session的2種方法,需要的朋友可以參考下2022-08-08使用Python防止SQL注入攻擊的實(shí)現(xiàn)示例
這篇文章主要介紹了使用Python防止SQL注入攻擊的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05python抓取京東價(jià)格分析京東商品價(jià)格走勢(shì)
本文介紹使用python抓取京東價(jià)格的代碼,用于分析京東商品價(jià)格走勢(shì)或者用于其它,大家參考使用吧2014-01-01使用Python請(qǐng)求http/https時(shí)如何設(shè)置失敗重試次數(shù)
這篇文章主要介紹了使用Python請(qǐng)求http/https時(shí)如何設(shè)置失敗重試次數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06