用django-pipeline爲靜態文件添加hash

用django-pipeline爲靜態文件添加hash

爲何須要hash靜態文件?

請看大公司裏怎樣開發和部署前端代碼? 張雲龍的答案。css

這樣,當靜態文件有修改時,會很方便的拿到最新的修改版本,而未修改的靜態文件則依然使用緩存。這樣避免了修改後用戶靜態文件不更新的尷尬,而且能夠充分利用緩存。html

demo

django_pipeline_demo前端

安裝

sudo mkdir /opt/projects
git clone https://github.com/duoduo369/django_pipeline_demo.git
cd django_pipeline_demo
ln -s $(pwd) /opt/projects
ln -s /opt/projects/django_pipeline_demo/deploy/nginx/django_pipeline.conf /etc/nginx/sites-enabled
pip install -r requirements.txt
python manage.py runserver 0.0.0.0:9888
nginx -s reload
vim /etc/hosts 添加 127.0.0.1:9888 django_pipline_demo.com

django的庫pipeline

mako, django-mako, django-pipeline-demopython

效果是這樣的,以 django_pipeline_demo 爲例。nginx

先說最終用法

  1. debug必須爲False(上線原本就是False),若是爲True則使用django默認查找靜態文件的方式,不會使用pipeline。
  2. python manage.py collectstatic
  3. 重啓django項目

重點代碼解釋

settings.py的幾個配置, 如何安裝配置django-pipeline,請移步文檔.git

解釋幾個collect有關的配置github

# python manage.py collectstatic 後文件會扔到STATIC_ROOT下面
STATIC_ROOT = './statics'

# django的模板會從這些目錄下查找
TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'),
)

# 開發時css的路徑,collectstatic會從這裏查找而後丟到STATIC_ROOT下
# 使用pipeline後會在靜態文件中添加hash碼,例如css/index.css
# collectstatic後會變成 css/index.as1df14jah8dfh.css
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static_dev"),
)

templates/common/static_pipeline.htmldjango

這是用mako定義了一個url,之後靜態文件使用這個url導入,就能夠找到hash的版本了。

<%!
from django.contrib.staticfiles.storage import staticfiles_storage
%>

<%def name='url(file)'><%
try:
    url = staticfiles_storage.url(file)
except:
    url = file
%>${url}</%def>

index.htmlvim

首先導入/common/static_pipeline.html,須要引用靜態文件的地方使用${static.url('未hash的文件路徑')}

<%namespace name='static' file='/common/static_pipeline.html'/>
....
    <link rel="stylesheet" href="${static.url('css/index.css')}" type="text/css" media="all" />
....
相關文章
相關標籤/搜索