對於Django來說靜態文件一般交由Web服務器處理,Django本身不處理靜態文件。為了使Django開發環境能夠處理靜態文件,Django有和生產環境不同的靜態文件配置方式。
Django 版本:1.10
開發(Dev)環境配置
一、STATIC_URL, STATICFILES_DIRS, STATIC_ROOT
1. 在app目錄下創建static目錄,將靜態文件和相關文件夾放到此目錄下,如your_app/static/img等
2. 確保settings.py中的INSTALLED_APPS中包含django.contrib.staticfiles,以及Debug為True
3. 設置settings.py中的STATIC_URL的值為“/static/”,作用參考5
4. 在模版開頭{% load static %}之后,在模版中使用{{ STATIC_URL }}作為靜態文件路徑前綴。比如css文件your_app/static/css/bootstrap.min.css,那么應用代碼為<link href="{% static "css/bootstrap.min.css" %}" rel="stylesheet">
5. 可以測試單獨通過url訪問靜態文件(http://127.0.0.1:8000/static/css/bootstrap.min.css)
6. STATICFILES_DIRS用來配置一些額外的靜態文件的地址,如下配置。模版中訪問的時候,參考4即可。
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
'/var/www/static/',
]
7. STATIC_ROOT, 設置絕對路徑, 在collectstatic運行的時候會把靜態文件拷貝到這個目錄中,其更多的作用是在從開發環境到生產環節過程中移植靜態文件。
二、MEDIA_ROOT和MEDIA_URL
MEDIA_ROOT:指用戶上傳的文件,比如在Model里面的FileFIeld,ImageField上傳的文件。如果你定義MEDIA_ROOT='/Users/xxx/media/',那么File=models.FileField(upload_to="app01/pic"),上傳的文件就會被保存到'/Users/xxx/media/app01/pic'
MEDIA_URL:URL的映射,前后要加上‘/’ 表示從根目錄開始,比如“/site_media/”,加上這個屬性之后,靜態文件的鏈接前面會加上這個值。
1. 在settings文件中設置MEDIA_URL,比如MEDIA_URL='/media/'
2. 在settings文件中設置MEDIA_ROOT,可以是任意位置(不與STATIC_ROOT相同),用於保存上傳的文件
3. urls文件中配置如下,
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # ... the rest of your URLconf goes here ... ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
4. 在settings文件中,TEMPLATES中'context_processors'下面新增'django.template.context_processors.media'
配置好后可以使用瀏覽器訪問上傳的文件, http://ip:port/MEDIA_URL/upload_path/file. 比如MEDIA_URL設置的是'/media/',MEDIA_ROOT設置的是'/User/xxx/',在models中設置的文件上傳到(upload_to=)'app01/pic',那么文件上傳后實際存儲地址為/User/xxx/app01/pic. 通過URL訪問的話:http://ip:port/media/app01/pic/test.jpg. 在前端模版中訪問這個上傳的圖片: <img src="{{ MEDIA_URL }}app01/pic/test.jpg"">
更多參考官方文檔。
生產環節部署
在部署階段最大的不同在於你必須讓web服務器來處理靜態文件,因此你必須在web服務器中配置,以便能讓web服務器能訪問靜態文件。官方文檔參考這里。后面會在自己試驗過后補充自己的備注。