Django中media的配置

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

文件的上傳

首先咱們在本身的Django項目中建立一個media文件夾:

而後在settings.py中設置MEDIA_ROOT
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
接着在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

在使用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中設置這樣一個或者幾個固定的、容易記憶的變量去存儲複雜的文件路徑,咱們在開發的時候就不會爲這些「雜事」去動腦筋了,這樣可以極大的提升咱們的編程效率。
相關文章
相關標籤/搜索