2015-06-19 17 views
9

Django 1.8 kullanıyorum ve bust'u önbelleğe almak için statik dosyalara bir parametre eklemek istiyorum.Django 1.8'de önbellek bozuluyor mu?

Bu Ne zaman manuel parametresini ayarlayarak, şu anda ne yapıyorum:

<link href="{% static 'css/openprescribing.css' %}?q=0.1.1" rel="stylesheet"> 

Ama parametresini güncelleştirmek için daha iyi bir yolu olmalı hissediyorum.

Şablondan geçirilen bir ayarın olması (ve birden fazla yerde güncellemeye sahip olmaktan kurtulacak) biraz daha iyi olurdu.

Ama Django'nun benim için otomatik olarak güncelleştirmesi çok güzel olurdu.

django-cachebuster ile ilgili notlar, otomatik olarak bunu staticfiles içinde yapmanın mümkün olduğunu ancak bununla ilgili statik dosyalarda hiçbir şey bulamadıklarını öneriyor.

Bunu yapmanın bir yolu bilen var mı?

+0

Tam olarak ne elde etmek istiyorsunuz? Caching? Eğer öyleyse, başarmak istediğinizden daha iyi yaklaşımlar vardır. Nginx ile çalışan Django 1.8 kullanıyorsanız, Nginx'in sizin için önbellekleme yapmasına izin vermenizi öneririm, Django en iyi yaptığı şeyi yapar. – Rexford

+0

@Rexford Nginx'i kullanıyorum, evet, CloudFlare ile. Gömme önbelleği (örneğin, yeni bir dosya yüklediğimde kullanıcıların yeni dosyayı otomatik olarak görmesini istiyorum) istiyorum. Nginx'in benim için otomatik olarak önbelleği önleyeceğini mi söylüyorsun? Eğer öyleyse, detaylar verebilir misiniz? – Richard

+0

Aşağıdaki cevabımı yerine getirin, yapmanız gereken şey tam olarak, yani yeni yüklenen içeriği hemen görünce, nginx size ücretsiz olarak böyle bir özellik sunuyor! Django yok, önbellek bozuculara ihtiyaç olmayabilir. – Rexford

cevap

12

Evet, bu contrib.staticfiles ile otomatik olarak yapılabilir. Bir karma kullanarak dosyaları yeniden adlandıracak iki ek depolama sınıfı vardır. Bunlar burada belgelenen: Dokümanlar ManifestStaticFilesStorage ve CachedStaticFilesStorage

:

o dosya adına dosyanın içeriğinin MD5 karma ekleyerek kolları dosya adlarını saklar StaticFilesStorage depolama arka uç alt sınıfı. Örneğin, css/styles.css dosyası ayrıca css/styles.55e7cbb9ba48.css olarak kaydedilir.

Bu depolamanın amacı, bazı sayfaların yine de söz konusu dosyalara atıfta bulunmaları durumunda eski dosyaları sunmaya devam etmektir. Çünkü onlar sizin tarafınızdan veya bir 3. parti proxy sunucusu tarafından önbelleğe alınır. Ayrıca, gelecekteki bir sayfayı uygulamak istiyorsanız, sonraki sayfa ziyaretleri için yükleme süresini hızlandırmak amacıyla dağıtılan dosyalara yönelik Expires üstbilgilerini de kullanabilirsiniz.

temel fark

CachedStaticFilesStorage ManifestStaticFilesStorage sınıfı gibi benzer sınıftır ancak bunun yerine staticfiles.json denilen statik Bildiri dosyasının işlenen dosyaların karma isimlerini saklamak için Django'nın önbelleğe alma çerçevesini kullanır. Bu, çoğunlukla dosya sistemine erişiminiz olmayan durumlar için kullanışlıdır.

Eğer STATICFILES_STORAGE ayar 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' veya 'django.contrib.staticfiles.storage.CachedStaticFilesStorage' ayarlandığında değiştirmeniz gerekir bunları sağlamak. Dosya adları, yalnızca üretimde olduğu gibi DEBUG=False olduğunda değişir.

+0

Dosya bir CDN'den sunulduğunda ne olur? –

-1

Caching konusunda uzman değilim, ancak nginx'in önbelleğe alma işleminin Django'yu kullanmasından daha iyi olabileceğini düşünüyorum. Django'nun işlenmesi gereken çok şey var, bu yüzden hafif statik sunucunun bu iğrenç işi yapmasına izin verebilirsiniz.

Ben CloudFlare kullanmayın, ama, ancak, benim statik önbelleğe hemen dosya değişiklikleri bu hattı kullanmak, Nginx (aynı dosyada şu) en son dosyayı yayar:

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { 
    expires 30d; 
    } 

bir olan snippet from this gist Şu anda üretim üretimini kullanıyorum, bu yüzden çalıştığını biliyorum.

Dikkat edeceğim bir nokta, MemCached'ın çalışmadığından ve bir Caching Arka Uçu olarak django'nuza bağlı olduğundan emin olun. Bunu söylüyorum, çünkü kafamı duvara çarptığında çok zaman harcadım, çünkü Memcached sayfamdaki her içeriğin 10 dakikaya kadar önbelleğe alınmasından kaynaklanıyordu. Benim .css değiştirebilir veya (statik) Yeni bir dosya yüklemek zaman, bu nginx yeri conf ile

, yeni bir dosya derhal sürece ben uygun dizine onları ed' python manage.py collectstatic ettik gibi devraldı

Yine de düzeltilmeyi bekliyorum, eğer bu aslında hile yapan kısım değilse. Yukarıdaki ile çalışır

Kanıtı Önbellek bozma (sizin deyişinizle)

  • Ben
  • sudo rm -rf static/
  • sitemi
  • Erişim (hala çalışıyor nginx) benim statik klasör Silinen sunucuya girdi
  • Statik yüklü değil
  • Geriye sarıldı ve python manage.py collectstatic
  • Siteme tekrar erişildi. Statics
  • ile yüklendi Tarayıcı sabit yenilemesi kullanılmadı. Hayır nginx yeniden yükle | kullanılan her şeyi yeniden başlatın.

Nginx, statiklerinizi önbelleğe almak için yeterince akıllıdır, ancak dosya yeni olduğunda ve yayınlandığında statik yeniden yükleyin.

Şablonunuzdaki Sonra
import time 
from django import template 

register = template.Library() 

@register.simple_tag() 
def cache_bust(): 
    return int(time.time()) 

sadece böyle bir şey yapmak Sadece hile yapar basit bir etiket oluşturmak
+1

Bu çözümdeki sorun, tarayıcının 30d için bu dosyayı önbelleğe almasıdır. Nginx yenilerini sunmayı bilse de tarayıcı isteği yapmaz. Tarayıcı, dosya ismindeki karmanın ulaştığı URL değiştiğinde yalnızca yeni bir istekte bulunacaktır. – dalore

+0

Ayrıca yerel sunucum tarafından sunulmayan, bazen bir CDN'den hizmet ettiğim şeyleri önbelleğe almam gerekiyor. Bence her ikisi de işe yarıyor, ama bazen Django şablonlarında büstleri önbelleğe almanız gerekiyor. –

0

.... ...

{% load cache_app %} 
<img src="/captcha/?cache_bust={% cache_bust %}" class="captcha"/> 

Ve önbellek bozmayı var basit yol.

+1

Bir topluluk olarak, bu iyi bir cevap değilse, neden diye bir yorum alabilir miyiz? Teşekkürler! Hisse kadar öğrenmek için buradayım. –

İlgili konular