bu daha uygun ihtiyaçları yapmak. Sunucuda biraz daha fazla yük olacaktır, ancak uygun önbellekleme, bunun çoğunu hafifletmeye yardımcı olabilir. Aşağıda, CSS'nin her yol için aynı olması durumunda çalışması gereken bir yolu özetledim. Tüm bu dosyaları dahil etmek için tek bir görünüm oluşturmanız gerekir, ancak bu yöntemi kullanarak CSS'nizi gerçekten optimize edebilirsiniz, böylece her sayfa için yalnızca bir CSS çağrısı yapabilirsiniz.
import md5
class LoadCss(template.Node):
def __init__(self, tag_name, css):
self.css = css
self.tag_name = tag_name
def render(self, context):
request = context['request']
md5key = md5.new(request.path).hexdigest()
if md5key not in request.session:
request.session[md5key] = list()
## This assumes that this method is being called in the correct output order.
request.session[md5key].append(self.css)
return '<!-- Require %s -->' % self.css
def do_load_css(parser, token):
tag_name, css = token.split_contents()
return LoadCss(tag_name, key)
register.tag('requires', do_load_css)
class IncludeCss(template.Node):
def __init__(self, tag_name):
self.tag_name = tag_name
def render(self, context):
request = context['request']
md5key = md5.new(request.path).hexdigest()
return '<link rel="stylesheet" href="/path/to/css/view/%s">' % md5key
def do_include_css(parser, token):
return IncludeCss(token)
register.tag('get_required_css', do_include_css)
views.py:
from django.conf import settings
from django.views.decorators.cache import cache_page
import os
@cache_page(60 * 15) ## 15 Minute cache.
def css_view(request, md5key):
css_requires = request.session.get(md5key, list())
output = list()
for css in css_requires:
fname = os.path.join(settings.MEDIA_ROOT, 'css', css) ## Assumes MEDIA_ROOT/css/ is where the CSS files are.
f = open(fname, 'r')
output.append(f.read())
HttpResponse(''.join(output), mimetype="text/css")
Bu oturumda, sonra bağlamda CSS bilgileri depolamak ve bunu yapmak için önbelleğe alma ile (bir görünümden çıktı sunulmasına olanak tanır Daha hızlı). Bu elbette, biraz daha fazla sunucu yüküne sahip olacak.
sadece yolun daha üzerindeki CSS değişir gerekiyorsa
, o zaman sadece ihtiyaçlarını karşılamak için
md5
satırları değiştirebilir. Tüm istek nesnesine ve içeriğe erişiminiz vardır, bu yüzden hemen hemen her şey orada olmalıdır.
Dikkat: oturum doldurulmadan önce tarayıcı CSS getirir eğer ikinci incelemede, bu bir yarış durumu neden olabilir. Django'nun bu şekilde çalıştığına inanmıyorum, ama şu anda bakmaktan hoşlanmıyorum.
Kısaca 'middleware' yeteneklerini kontrol ettikten sonra, oluşturulan html eklemek için bunu kullanmayı düşünüyorum. Bununla ilgili sorun, sorunsuz çalışabilmek için çeşitli statik sıkıştırma uygulamalarından herhangi birinin elde edilmesinin daha zor olmasıdır. –
Birisi ilgilenirse, bu özel problem için oldukça zarif olmayan bir çözüm olan github üzerinde bir uygulama var - http://github.com/pappy74/django-requires_js_css. Jack'in aşağıdaki cevabı biraz benzer, ama güzel ve düzgün bir uygulama olarak paketlenmiş. –