Django-Compressor 靜態檔案壓縮
在網站開發階段,對於靜態資原始檔比如JS,CSS等檔案都是未經過壓縮合並處理的,這對於訪問量巨大的網站來說不僅浪費頻寬,而且也會影響網站的訪問速度。django-compressor的作用就是將靜態檔案壓縮合併成一個檔案,不僅減少了網站的請求次數,還能節省網路頻寬。
本文分為兩部分,第一部分介紹settings檔案相關配置對靜態檔案的影響,然後再討論Compressor的如何使用。如果你對setting檔案非常瞭解不妨直接從第二部分開始閱讀。
第一部分:Setting檔案配置
早期的django處理靜態資源要比較囉嗦,還要配置urlpatterns,不過自從django1.6開始加入了django.contrib.staticfiles
django.contrib.staticfiles
是django的內建(build-in)app,用於處理js、css、images等靜態資源。首先確保這個app已經包含在INSTALLED_APPS
中,django1.6及以上版本是預設包含該app在其中的。
一:指定STATIC_URL
STATIC_URL = '/static/'
STATIC_URL是客戶端訪問靜態資源的根路徑,比如:模版中定義的資源路徑是:
{% load staticfiles %} <script src="{% static "js/blog.js"%}"></script>
最終渲染後的效果是:
<script src="/static/js/blog.js"></script>
預設django會從每個app目錄的static子目錄下查詢靜態檔案,因此通常情況下你都是將相關靜態檔案放在各自的app/static目錄下。Django怎麼知道從app/static目錄查詢靜態檔案呢?原來django有個預設配置項STATICFILES_FINDERS
,預設值:
("django.contrib.staticfiles.finders.FileSystemFinder", "django.contrib.staticfiles.finders.AppDirectoriesFinder")
AppDirectoriesFinder
模組就是負責在app/static目錄下找靜態檔案的。至於FileSystemFinder我們稍後介紹。
二:指定STATICFILES_DIRS
像jquery,bootstrap等公用的靜態資原始檔在很多個app中都會共用到,如果是放在某個app中顯得不符python哲學,因此django提供了一個配置可以指定任意目錄來存放這些公用的資原始檔。配置引數是:STATICFILES_DIRS
,比如:
STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), '/var/www/static/', )
這意味著靜態檔案可以放在磁碟的任何一個位置(只要有許可權訪問)現在應該明白FileSystemFinder的作用了吧。就是用來查詢定義在STATICFILES_DIRS中的靜態檔案的。
三:指定STATIC_ROOT
上面的配置就是在開發環境下Django對靜態資源的處理過程,那麼在生產環境下是怎麼處理的呢?如果還是這樣由django自己來處理,那麼累死Django了,對於靜態資源直接由Nginx這樣的代理去處理就行,而且Nginx處理這些非邏輯的資源效能也非常高。於是Django提供了一個非常方便的靜態資源管理命令django.contrib.staticfiles
將系統要用的資原始檔從不同目錄收集到統一的目錄中去,然後在Nginx的配置中指定這些靜態資源的位置即可。
收集這些靜態檔案需要先指定存放這些靜態資源的目錄:STATIC_ROOT
STATIC_ROOT="/var/www/foofish.net/static/"
執行collectstatic管理命令
python manage.py collectstatic
執行該命令,所有靜態資源都將拷貝到STATIC_ROOT指定的目錄中。
四:配置Nginx
在Nginx的配置檔案中指定凡是來自/static/
路徑的請求直接訪問STATIC_ROOT
。
location /static { alias /var/www/foofish.net/static/; # your Django project's static files }
第二部分:Compressor的使用
django-compressor 的安裝配置非常簡單
安裝:
pip install django_compressor
配置:
COMPRESS_ENABLED = True INSTALLED_APPS = ( # other apps "compressor", ) STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 'django.contrib.staticfiles.finders.FileSystemFinder', 'compressor.finders.CompressorFinder',)
Django-Compressor開啟與否取決於DEBUG引數,預設是COMPRESS_ENABLED與DEBUG的值相反。因為Django-Compressor的功能本身是用在生產環境下專案釋出前對靜態檔案壓縮處理的。因此想在開發階段(DEBUG=True)的時候做測試使用,需要手動設定COMPRESS_ENABLED=True
使用
在模板檔案中新增模板標籤 {% load compress %}
{% load compress %} #處理css {% compress css %} <link href="{% static "css/bootstrap.min.css" %}" rel="stylesheet"> <link href="{% static "css/blog-home.css" %}" rel="stylesheet"> <link href="{% static "css/github.css" %}" rel="stylesheet"> {% endcompress %} #處理js {% compress js %} <script src="{% static "js/jquery-1.10.2.js" %}"></script> <script src="{% static "js/bootstrap.js" %}"></script> <script src="{% static "js/blog.js" %}"></script> {% endcompress %}
執行命令:python manage.py compress
,最終檔案將合併成:
<link rel="stylesheet" href="/static/CACHE/css/f18b10165eed.css" type="text/css"> <script type="text/javascript" src="/static/CACHE/js/9d1f64ba50fc.js"></script>
f18b10165eed.css
、9d1f64ba50fc.js
這兩檔案在STATIC_ROOT
目錄下面。
每次修改了js、css檔案後,都需要重新載入最新的檔案到STATIC_ROOT
目錄下去,因此需要重新執行命令:
python manage.py collectstatic python manage.py compress
關注公眾號「Python之禪」(id:vttalk)獲取最新文章