Django media MEDIA_URL MEDIA_ROOT 的配置
Django中media文件夾是我們文件(比如頭像、文件、視頻等)數據十分重要的存放處,這里以用戶頭像的上傳以及media文件的訪問為例為大家詳細講解下media的相關實例。 在Django項目的settings.py
文件中,我們可以配置兩個關於media的參數:MEDIA_ROOT
與MEDIA_URL
,下面我們就文件的上傳與訪問一一對這兩個參數進行講解:
Django 高級實戰編程
Django高級實戰 開發企業級問答網站 項目結合:需求分析/Django高級用法/算法/設計模式/TestCase測試/雲計算服務
Django開發企業實戰 面向就業/升職(中高級教程)
視頻教程分享地址: https://study.163.com/course/introduction/1209407824.htm?share=2&shareId=400000000535031
文件的上傳
首先我們在自己的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/'。我們可以看一下演示效果:
