Django - Tembolok
Men-cache sesuatu berarti menyimpan hasil kalkulasi yang mahal, sehingga Anda tidak melakukannya saat Anda membutuhkannya. Berikut ini adalah pseudo code yang menjelaskan cara kerja caching -
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 datang dengan sistem temboloknya sendiri yang memungkinkan Anda menyimpan halaman dinamis Anda, untuk menghindari menghitungnya lagi bila diperlukan. Hal yang baik dalam kerangka Cache Django adalah bahwa Anda dapat menyimpan -
- Output dari tampilan tertentu.
- Bagian dari template.
- Seluruh situs Anda.
Untuk menggunakan tembolok di Django, hal pertama yang harus dilakukan adalah menyetel di mana tembolok akan tinggal. Kerangka cache menawarkan kemungkinan yang berbeda - cache dapat disimpan dalam database, pada sistem file atau langsung di memori. Pengaturan dilakukan disettings.py file proyek Anda.
Menyiapkan Cache di Database
Cukup tambahkan berikut ini di file project settings.py -
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_table_name',
}
}
Agar ini berfungsi dan untuk menyelesaikan pengaturan, kita perlu membuat tabel cache 'my_table_name'. Untuk ini, Anda perlu melakukan hal berikut -
python manage.py createcachetable
Menyiapkan Cache di Sistem File
Cukup tambahkan berikut ini di file project settings.py -
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',
}
}
Menyiapkan Cache dalam Memori
Ini adalah cara caching yang paling efisien, untuk menggunakannya Anda dapat menggunakan salah satu opsi berikut tergantung pada pustaka pengikat Python yang Anda pilih untuk cache memori -
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',
}
}
Caching Seluruh Situs
Cara termudah menggunakan tembolok di Django adalah men-cache seluruh situs. Ini dilakukan dengan mengedit opsi MIDDLEWARE_CLASSES di project settings.py. Berikut ini perlu ditambahkan ke opsi -
MIDDLEWARE_CLASSES += (
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
)
Perhatikan bahwa urutan penting di sini, Pembaruan harus dilakukan sebelum Ambil middleware.
Kemudian di file yang sama, Anda perlu mengatur -
CACHE_MIDDLEWARE_ALIAS – The cache alias to use for storage.
CACHE_MIDDLEWARE_SECONDS – The number of seconds each page should be cached.
Menyimpan Tampilan dalam cache
Jika Anda tidak ingin meng-cache seluruh situs, Anda dapat meng-cache tampilan tertentu. Ini dilakukan dengan menggunakancache_pagedekorator yang datang dengan Django. Misalkan kita ingin menyimpan hasil dari fileviewArticles melihat -
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)
Seperti yang dapat Anda lihat cache_pagemembutuhkan jumlah detik Anda ingin hasil tampilan di-cache sebagai parameter. Dalam contoh kami di atas, hasilnya akan disimpan dalam cache selama 15 menit.
Note - Seperti yang telah kita lihat sebelumnya, tampilan di atas dipetakan ke -
urlpatterns = patterns('myapp.views',
url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 'viewArticles', name = 'articles'),)
Karena URL mengambil parameter, setiap panggilan yang berbeda akan di-cache secara terpisah. Misalnya, permintaan ke / myapp / artikel / 02/2007 akan disimpan dalam cache secara terpisah ke / myapp / artikel / 03/2008.
Menyimpan tampilan juga bisa langsung dilakukan di file url.py. Maka berikut ini memiliki hasil yang sama seperti di atas. Cukup edit file myapp / url.py Anda dan ubah URL yang dipetakan terkait (di atas) menjadi -
urlpatterns = patterns('myapp.views',
url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/',
cache_page(60 * 15)('viewArticles'), name = 'articles'),)
Dan, tentu saja, ini tidak lagi dibutuhkan di myapp / views.py.
Menyimpan Fragmen Template
Anda juga dapat membuat cache bagian template, ini dilakukan dengan menggunakan file cachemenandai. Mari kita ambilhello.html template -
{% 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 %}
Dan untuk meng-cache blok konten, template kita akan menjadi -
{% 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 %}
Seperti yang Anda lihat di atas, tag cache akan mengambil 2 parameter - waktu Anda ingin blok di-cache (dalam detik) dan nama yang akan diberikan ke fragmen cache.