在使用Django加載圖片時遇到了一些問題,在模板html文件中無論使用絕對路徑還是當前相對路徑都無法找到圖片,一直報403和404的錯誤,后來結合官網和網上的其他資料總算是成功了,這里記下來。
# Static files (CSS, JavaScript, Images)
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
]
STATIC_URL的意思是將靜態文件的http可訪問路徑設為/static/,而STATICFILES_DIRS則是真正存儲靜態文件的目錄,你可以通過STATICFILES_DIRS添加多個靜態文件存儲目錄。
2.修改模板中對於圖片的引用路徑:
{% load static %}
<img src="{% static "1.png" %}" alt="Leo頭像" height=100 width=100 />
Django在查找圖片時會默認的使用static()方法(前提是你INSTALLED_APPS里包含django.contrib.staticfiles)到你給定的STATICFILES_DIRS目錄下尋找靜態文件,這種load寫法是官網寫法,比較推薦。
我們還可以在static下建每個app的靜態文件存放路徑,http訪問時只要加上app名就好了,例如<img src="{% static "app_name/1.png" %}" alt="Leo頭像" height=100 width=100 />
3.創建相應的目錄,並將圖片放置到此路徑下:
mkdir -p /root/Django/mysite/static --/root/Django/mysite/是我的project根目錄(BASE_DIR)
這樣就可以實現調用了,示例結果如下:
而且此時我們還可以通過以下URL直接訪問此圖片:(這就是STATIC_URL的功能,但要保證此路徑下圖片真實存在)
http://192.168.1.193:8000/static/1.png --8000是我的對外端口
關於STATIC_ROOT:
以上的static_url參數使用的是基於BASE_DIR的相對路徑,但很多時候我們引用的靜態文件並不一定能被允許放在BASE_DIR目錄下,可能是有一個統一的存放路徑存放的,因此django的static()方法也提供了另一種訪問方式,即STATIC_ROOT參數(static()的第二個輸入參數):
關於MEDIA_URL和MEDIA_ROOT:
上邊解釋的STATIC相關參數適用於靜態的文件,對於用戶上傳的可修改的媒體文件例如頭像圖片等,放在STATIC_URL中就不合適了,MEDIA_URL和MEDIA_ROOT這倆參數就是用於處理媒體文件存儲的。
MEDIA_URL和MEDIA_ROOT的差別基本等同於STATIC_URL和STATIC_ROOT的差別。
目前發現有一點不一樣的:即便設置了MEDIA_URL也不能直接通過http訪問到媒體文件,還是需要將路徑加入urls.py,這點需要注意。
更多的關於在正式開發中處理靜態文件和媒體文件的信息,參考官方文檔:
https://docs.djangoproject.com/en/2.1/howto/static-files/
https://docs.djangoproject.com/en/2.1/howto/static-files/deployment/