1. 程式人生 > 其它 >django中影象上傳(檔案上傳)的配置

django中影象上傳(檔案上傳)的配置

一、settings配置

  • MEDIA_URL= "/media/" # 可以換成你自己的
    這個是生成URL用的。如果你的資料庫中存的影象假設是:img/test.png,那麼生成的URL: /media/img/test.png。
  • MEDIA_ROOT = BASE_DIR / 'media' #
    這個是圖片上傳的根目錄。如果你在ImageField或者FileField中設定了upload_to屬性(假設你設定為img),那麼django將會把檔案上傳到: BASE_DIR /media/img下。
  • 'django.template.context_processors.media'
    配置了這兩個選項之外,你還得在TEMPLATES的'OPTIONS'中新增上面這個'context_processors',加上之後大約是這個樣子的:
TEMPLATES = [
    {
        # 跟本問題無關的我刪去了       
        'OPTIONS': {
            'context_processors': [
                 # 跟本問題無關的我刪去了 
                'django.template.context_processors.media',
            ],
        },
    },
]

只有添加了這個,你才可以在模板檔案中使用{{ MEDIA_URL }}

二、路由問題

完成了上面的配置,還是不能訪問圖片檔案。因為還沒有路由。網路上很多人是用url新增路由,大約是這個樣子,
高版本的可以用 re_path。

url(r'^media/(?P<path>.*)$, serve, {
'document_root': settings.MEDIA_ROOT,
})

還有人在patterns後加上下面的程式碼,大概都可以工作。:

+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

可是不知道是什麼原理。

三、研究後終於想通了

通過將加上+static後的patterns打印出來:

[<URLPattern 'upload/'>, <URLPattern 'show/'>, <URLPattern '^crm/media/(?P<path>.*)$'>]

突然明白:static也不過是生成了個URL,+也就是兩個陣列的加操作。
生成的URL是以settings.MEDIA_ROOT為參照的。實際上主是:MEDIA_URL和MEDIA_ROOT建立了一種對應關係。
和MEDIA_URL相關的URL都去MEDIA_ROOT下去找檔案。

四、在測試的時候一定要不斷清理快取,不然效果可能受影響。而你可能一直在正確的程式碼中尋找錯誤。