Django - Bộ nhớ đệm
Lưu vào bộ nhớ cache một cái gì đó là để lưu kết quả của một phép tính tốn kém, để bạn không thực hiện nó vào lần sau khi cần. Sau đây là một mã giả giải thích cách hoạt động của bộ nhớ đệm:
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 đi kèm với hệ thống bộ nhớ đệm riêng cho phép bạn lưu các trang động của mình, để tránh tính toán lại khi cần. Điểm tốt trong Django Cache framework là bạn có thể cache -
- Kết quả của một chế độ xem cụ thể.
- Một phần của mẫu.
- Toàn bộ trang web của bạn.
Để sử dụng bộ nhớ đệm trong Django, điều đầu tiên cần làm là thiết lập vị trí bộ nhớ đệm sẽ ở. Khung bộ đệm cung cấp các khả năng khác nhau - bộ đệm có thể được lưu trong cơ sở dữ liệu, trên hệ thống tệp hoặc trực tiếp trong bộ nhớ. Cài đặt được thực hiện trongsettings.py tệp dự án của bạn.
Thiết lập bộ nhớ đệm trong cơ sở dữ liệu
Chỉ cần thêm phần sau vào tệp dự án settings.py -
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_table_name',
}
}
Để điều này hoạt động và hoàn tất cài đặt, chúng ta cần tạo bảng bộ nhớ cache 'my_table_name'. Đối với điều này, bạn cần làm như sau:
python manage.py createcachetable
Thiết lập bộ nhớ đệm trong hệ thống tệp
Chỉ cần thêm phần sau vào tệp dự án settings.py -
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',
}
}
Thiết lập bộ nhớ đệm trong bộ nhớ
Đây là cách lưu trữ hiệu quả nhất, để sử dụng, bạn có thể sử dụng một trong các tùy chọn sau tùy thuộc vào thư viện liên kết Python mà bạn chọn cho bộ nhớ đệm -
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',
}
}
Lưu vào bộ nhớ đệm Toàn bộ Trang web
Cách đơn giản nhất để sử dụng cache trong Django là cache toàn bộ trang web. Điều này được thực hiện bằng cách chỉnh sửa tùy chọn MIDDLEWARE_CLASSES trong cài đặt dự án.py. Phần sau cần được thêm vào tùy chọn:
MIDDLEWARE_CLASSES += (
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
)
Lưu ý rằng thứ tự quan trọng ở đây, Cập nhật nên đến trước Tìm nạp phần mềm trung gian.
Sau đó, trong cùng một tệp, bạn cần đặt -
CACHE_MIDDLEWARE_ALIAS – The cache alias to use for storage.
CACHE_MIDDLEWARE_SECONDS – The number of seconds each page should be cached.
Lưu vào bộ nhớ cache một lượt xem
Nếu bạn không muốn lưu vào bộ nhớ cache toàn bộ trang web, bạn có thể lưu vào bộ nhớ cache một chế độ xem cụ thể. Điều này được thực hiện bằng cách sử dụngcache_pagetrình trang trí đi kèm với Django. Giả sử chúng tôi muốn lưu vào bộ nhớ cache kết quả củaviewArticles xem -
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)
Bạn có thể thấy cache_pagelấy số giây bạn muốn kết quả xem được lưu vào bộ nhớ cache dưới dạng tham số. Trong ví dụ của chúng tôi ở trên, kết quả sẽ được lưu vào bộ nhớ cache trong 15 phút.
Note - Như chúng ta đã thấy trước đây, chế độ xem ở trên được ánh xạ tới -
urlpatterns = patterns('myapp.views',
url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 'viewArticles', name = 'articles'),)
Vì URL đang nhận tham số, mỗi lệnh gọi khác nhau sẽ được lưu vào bộ nhớ đệm riêng. Ví dụ: yêu cầu đến / myapp / posts / 02/2007 sẽ được lưu trữ riêng vào / myapp / Articles / 03/2008.
Việc lưu vào bộ nhớ cache một dạng xem cũng có thể được thực hiện trực tiếp trong tệp url.py. Thì phần sau có kết quả tương tự như phần trên. Chỉ cần chỉnh sửa tệp myapp / url.py của bạn và thay đổi URL được ánh xạ có liên quan (ở trên) thành -
urlpatterns = patterns('myapp.views',
url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/',
cache_page(60 * 15)('viewArticles'), name = 'articles'),)
Và tất nhiên, nó không còn cần thiết trong myapp / views.py.
Lưu vào bộ nhớ đệm một mảnh mẫu
Bạn cũng có thể lưu vào bộ nhớ cache các phần của mẫu, điều này được thực hiện bằng cách sử dụng cachenhãn. Hãy lấy của chúng tôihello.html mẫu -
{% 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 %}
Và để lưu vào bộ nhớ cache khối nội dung, mẫu của chúng tôi sẽ trở thành -
{% 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 %}
Như bạn thấy ở trên, thẻ cache sẽ có 2 tham số - thời gian bạn muốn khối được lưu vào bộ nhớ cache (tính bằng giây) và tên được đặt cho phân đoạn bộ nhớ cache.