Django media文件夾詳解


Django中media文件夾是我們文件(比如頭像、文件、視頻等)數據十分重要的存放處,這里以用戶頭像的上傳以及media文件的訪問為例為大家詳細講解下media的相關實例。
在Django項目的settings.py文件中,我們可以配置兩個關於media的參數:MEDIA_ROOTMEDIA_URL,下面我們就文件的上傳與訪問一一對這兩個參數進行講解:

文件的上傳

1、首先我們在自己的Django項目中創建一個media文件夾:

2、在settings.py中設置MEDIA_ROOT
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
3、在urls.py中設置media路由的相關配置:
from django.urls import path,re_path
from django.views.static import serve
from cnblog import settings

##media配置——配合settings中的MEDIA_ROOT的配置,就可以在瀏覽器的地址欄訪問media文件夾及里面的文件了
re_path(r'media/(?P<path>.*)$',serve,{'document_root':settings.MEDIA_ROOT}),
有了上面這個路由設置,我們就可以在瀏覽器的地址欄根據media文件夾中文件的路徑去訪問對應的文件了(需要注意的是為了保證安全,默認情況下Django項目中各目錄的文件是不能通過地址欄去訪問的)。
當然,我們這里實現的是文件上傳的功能,需要將文件信息傳給數據庫保存,models.py文件中的內容如下:
class UserInfo(models.Model):
    nid = models.AutoField(primary_key=True)
    ##頭像是一個FileField——注意這里必須是“相對路徑”,不能是/avatars/這樣的絕對路徑
    avatar = models.FileField(upload_to='avatars/',default='avatars/default.jpg')
我們用FileField存放上傳的文件,這里需要注意:media文件夾是我們上傳文件的“根目錄”,如果我們想再為這個“根目錄”指定“子目錄”的話需要通過參數upload_to去指定,也就是說,我們上傳的文件會保存在/media/avatars目錄下,后面的參數default表示默認圖像————比如說我們想要上傳頭像,用戶不指定頭像的時候就用default參數指定的圖片。
這里省略模板與視圖函數的實現,只說明media參數的用法
當我們將圖片上傳到服務器后,就會在我們指定的目錄看到上傳的文件了:

文件的訪問

其實,當我們在上面進行了MEDIA_ROOT與路由的相關配置后,在瀏覽器輸入文件的路徑就可以查看對應的文件了。比如我們想查看上圖中的222.jpg文件,可以在程序運行的時候在地址欄輸入:
http://127.0.0.1:8000/media/avatars/222.jpg
這樣就可以顯示這個圖片了。
但是實際中,用戶不可能去地址欄輸入文件路徑的,我們做程序的目的就是盡最大限度的解放用戶的操作————那么,是否有一種方法能夠讓用戶僅僅點擊一下就能查看到對應的文件呢?
答案當然是肯定的!
這就用到了media的另外一個參數————MEDIA_URL
在使用MEDIA_URL之前我們需要新增一條中間件,在settings.py文件的TEMPLATES參數中加入中間件:
django.template.context_processors.media
然后我們在settings.py中加入MEDIA_URL的參數:
MEDIA_URL = '/media/'
接着我們再新增一條測試路由:
##測試
path('aa/bb',views.aa),
視圖也比較簡單:
def aa(request):
    return  render(request,'aa.html')
然后模板文件中我們做相應的功能:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="{{ MEDIA_URL }}avatars/222.jpg">查看media目錄下的一張圖片</a>
<p>MEDIA_URL: {{ MEDIA_URL }}</p>
</body>
</html>
假如我們想實現點擊a標簽的文字出來222.jpg圖片,可以在href加上圖片的路徑,這里大家看到了,我們用模板語言{{ MEDIA_URL }}進行渲染,這里模板語言渲染出來的值其實就是我們在settings中設置的'/media/'。我們可以看一下演示效果:

我們可以看到,點擊鏈接的訪問效果與在瀏覽器的地址欄輸入文件路徑的效果一樣。
可能有人會問了,既然效果一樣,那為何不在模板中直接將a標簽的href寫死呢,何必用模板語言去渲染?!
當然,二者的效果固然一樣,但是當我們的項目做大的時候,文件目錄的組織形式會越來越復雜,在settings中設置這樣一個或者幾個固定的、容易記憶的變量去存儲復雜的文件路徑,我們在開發的時候就不會為這些“瑣事”去動腦筋了,這樣能夠極大的提高我們的編程效率。

轉自:千里駿骨


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM