Django - Önbelleğe alma
Bir şeyi önbelleğe almak, pahalı bir hesaplamanın sonucunu saklamaktır, böylece bir dahaki sefere ihtiyacınız olduğunda bunu yapmazsınız. Aşağıda, önbelleğe almanın nasıl çalıştığını açıklayan sözde bir kod verilmiştir -
given a URL, try finding that page in the cache
if the page is in the cache:
return the cached page
else:
generate the page
save the generated page in the cache (for next time)
return the generated page
Django, gerektiğinde yeniden hesaplamaktan kaçınmak için dinamik sayfalarınızı kaydetmenize izin veren kendi önbelleğe alma sistemiyle birlikte gelir. Django Cache çerçevesinin iyi yanı önbelleğe alabilmenizdir -
- Belirli bir görünümün çıktısı.
- Bir şablonun bir parçası.
- Sitenizin tamamı.
Django'da önbellek kullanmak için yapılacak ilk şey, önbelleğin nerede kalacağını ayarlamaktır. Önbellek çerçevesi farklı olanaklar sunar - önbellek veritabanına, dosya sistemine veya doğrudan belleğe kaydedilebilir. Ayar,settings.py projenizin dosyası.
Veritabanında Önbelleği Ayarlama
Proje settings.py dosyasına aşağıdakileri eklemeniz yeterlidir -
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_table_name',
}
}
Bunun çalışması ve ayarı tamamlaması için 'my_table_name' önbellek tablosunu oluşturmamız gerekiyor. Bunun için aşağıdakileri yapmanız gerekir -
python manage.py createcachetable
Dosya Sisteminde Önbelleği Ayarlama
Proje settings.py dosyasına aşağıdakileri eklemeniz yeterlidir -
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',
}
}
Bellekte Önbelleği Ayarlama
Bu, önbelleğe almanın en verimli yoludur, kullanmak için, bellek önbelleği için seçtiğiniz Python bağlama kitaplığına bağlı olarak aşağıdaki seçeneklerden birini kullanabilirsiniz -
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
Or
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'unix:/tmp/memcached.sock',
}
}
Tüm Siteyi Önbelleğe Alma
Django'da önbellek kullanmanın en basit yolu tüm siteyi önbelleğe almaktır. Bu, proje settings.py dosyasında MIDDLEWARE_CLASSES seçeneğini düzenleyerek yapılır. Aşağıdakilerin seçeneğe eklenmesi gerekir -
MIDDLEWARE_CLASSES += (
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
)
Burada sıranın önemli olduğunu unutmayın. Güncelleme, Getirme ara yazılımından önce gelmelidir.
Sonra aynı dosyada, ayarlamanız gerekir -
CACHE_MIDDLEWARE_ALIAS – The cache alias to use for storage.
CACHE_MIDDLEWARE_SECONDS – The number of seconds each page should be cached.
Bir Görünümü Önbelleğe Alma
Tüm siteyi önbelleğe almak istemiyorsanız, belirli bir görünümü önbelleğe alabilirsiniz. Bu,cache_pageDjango ile birlikte gelen dekoratör. Diyelim ki sonucunu önbelleğe almak istiyoruzviewArticles görünüm -
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def viewArticles(request, year, month):
text = "Displaying articles of : %s/%s"%(year, month)
return HttpResponse(text)
Gördüğün gibi cache_pagegörüntüleme sonucunun parametre olarak önbelleğe alınmasını istediğiniz saniye sayısını alır. Yukarıdaki örneğimizde, sonuç 15 dakika süreyle önbelleğe alınacaktır.
Note - Daha önce gördüğümüz gibi, yukarıdaki görünüm -
urlpatterns = patterns('myapp.views',
url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 'viewArticles', name = 'articles'),)
URL parametreleri aldığından, her farklı çağrı ayrı ayrı önbelleğe alınacaktır. Örneğin, / uygulamam / makaleler / 02 / 2007'ye yönelik istek, / uygulamam / makaleler / 03 / 2008'e ayrı olarak önbelleğe alınacaktır.
Bir görünümü önbelleğe almak, doğrudan url.py dosyasında da yapılabilir. O zaman aşağıdaki sonuç, yukarıdakiyle aynı sonuca sahiptir. Myapp / url.py dosyanızı düzenleyin ve ilgili eşlenen URL'yi (yukarıda) -
urlpatterns = patterns('myapp.views',
url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/',
cache_page(60 * 15)('viewArticles'), name = 'articles'),)
Ve tabii ki artık myapp / views.py'de buna gerek yok.
Bir Şablon Parçasını Önbelleğe Alma
Bir şablonun bölümlerini de önbelleğe alabilirsiniz, bu, cacheetiket. Hadi alalımhello.html şablon -
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
{% for day in days_of_week %}
{{day}}
</p>
{% endfor %}
{% endblock %}
İçerik bloğunu önbelleğe almak için şablonumuz -
{% load cache %}
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% cache 500 content %}
{% block content %}
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
{% for day in days_of_week %}
{{day}}
</p>
{% endfor %}
{% endblock %}
{% endcache %}
Yukarıda görebileceğiniz gibi, önbellek etiketi 2 parametre alacaktır - bloğun önbelleğe alınmasını istediğiniz zaman (saniye cinsinden) ve önbellek parçasına verilecek ad.