解決Django生產(chǎn)環(huán)境無法加載靜態(tài)文件問題的解決
起步
線上部署時因設(shè)置了 settings.DEBUG = False 會導(dǎo)致靜態(tài)文件都是 404 的情況。主要原因是應(yīng)為關(guān)閉DEBUG模式后,Django 便不提供靜態(tài)文件服務(wù)了。
runserver 的啟動
如果運行是通過 runserver 命令的方式,那簡單,在啟動 runserver 指令后追加 --insecure 選項能參數(shù)強制 django 處理靜態(tài)文件。
其他方式啟動
但如果是通過 uwsgi 或 daphne 等啟動的話,追加選項的方式就不管用了。要解決這個問題,我們要手動去使用靜態(tài)文件服務(wù),這種處理方式是比較推薦的,因為它同時也支持了 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)文件的路由匹配,但重點是這里多了個函數(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。通過寫個 return_static 函數(shù)其實與 --insecure 的選項是異曲同工的。
媒體文件的處理
媒體文件的處理當(dāng)然可以將上面 url 規(guī)則變動下就能加載了。如果用上面的方法來處理媒體文件可以得 90 分,那么下面的方法可以得 95 分。
上面的方法會搜索多個目錄的,盡管開發(fā)人員會將靜態(tài)文件同一放目錄下。但 Django 的 admin 模塊的靜態(tài)文件存放在其他地方的。
而媒體文件,我們只會限定在一個目錄的,所以更好的處理方法是只在一個目錄下搜索:
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)文件都只會在一個目錄下(使用 collectstatic 能將所有靜態(tài)文件都復(fù)制到一個目錄),那么也請用這個 static_serve 方式去處理靜態(tài)文件,我們希望我們的程序是精益求精的良品。
總結(jié)
另外還有通過第三方程序來處理靜態(tài)文件,比如 nginx 設(shè)置 alias 等。但顯然我更希望是程序自身的處理方式。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Django+Uwsgi+Nginx如何實現(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 實現(xiàn)生產(chǎn)環(huán)境部署
- 詳解Django+Uwsgi+Nginx的生產(chǎn)環(huán)境部署
- Django + Uwsgi + Nginx 實現(xiàn)生產(chǎn)環(huán)境部署的方法
- django生產(chǎn)環(huán)境搭建(uWSGI+django+nginx+python+MySQL)
相關(guān)文章
使用python爬蟲實現(xiàn)抓取動態(tài)加載數(shù)據(jù)
這篇文章主要給大家介紹了如何用python爬蟲抓取豆瓣電影“分類排行榜”中的電影數(shù)據(jù),比如輸入“犯罪”則會輸出所有犯罪影片的電影名稱、評分,文中通過代碼示例和圖文介紹的非常詳細,需要的朋友可以參考下2024-01-01
Python3.4實現(xiàn)遠程控制電腦開關(guān)機
這篇文章主要為大家詳細介紹了Python3.4實現(xiàn)遠程控制電腦開關(guān)機的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
python2爬取百度貼吧指定關(guān)鍵字和圖片代碼實例
這篇文章主要介紹了python2爬取百度貼吧指定關(guān)鍵字和圖片代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
Python跨文件實現(xiàn)字符串填充的三種實現(xiàn)方法
本文主要介紹了Python跨文件實現(xiàn)字符串填充的三種實現(xiàn)方法,包括format方法、%格式化操作符和eval函數(shù)結(jié)合f-string,具有一定的參考價值,感興趣的可以了解一下2024-12-12
在python項目的docker鏡像里如何使用pdm管理依賴
在 DjangoStarter 項目中,我已經(jīng)使用 pdm 作為默認(rèn)的包管理器,不再直接使用 pip,所以部署的時候 dockerfile 和 docker-compose 配置需要修改一下,這篇文章主要介紹了在python項目的docker鏡像里使用pdm管理依賴,需要的朋友可以參考下2024-08-08

