Django - buforowanie

Buforowanie czegoś oznacza zapisanie wyniku kosztownego obliczenia, aby nie wykonywać go następnym razem, gdy będzie to potrzebne. Poniżej znajduje się pseudo kod wyjaśniający, jak działa buforowanie -

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 posiada własny system buforowania, który umożliwia zapisywanie stron dynamicznych, aby uniknąć ich ponownego obliczania, gdy zajdzie taka potrzeba. Zaletą frameworka Django Cache jest to, że można buforować -

  • Dane wyjściowe określonego widoku.
  • Część szablonu.
  • Cała Twoja witryna.

Aby użyć pamięci podręcznej w Django, pierwszą rzeczą do zrobienia jest ustawienie, gdzie pamięć podręczna pozostanie. Struktura pamięci podręcznej oferuje różne możliwości - pamięć podręczną można zapisać w bazie danych, w systemie plików lub bezpośrednio w pamięci. Ustawienie odbywa się wsettings.py plik twojego projektu.

Konfigurowanie pamięci podręcznej w bazie danych

Po prostu dodaj następujące elementy w pliku settings.py projektu -

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
      'LOCATION': 'my_table_name',
   }
}

Aby to zadziałało i aby zakończyć ustawianie, musimy utworzyć tabelę pamięci podręcznej „my_table_name”. W tym celu musisz wykonać następujące czynności -

python manage.py createcachetable

Konfigurowanie pamięci podręcznej w systemie plików

Po prostu dodaj następujące elementy w pliku settings.py projektu -

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
      'LOCATION': '/var/tmp/django_cache',
   }
}

Konfigurowanie pamięci podręcznej w pamięci

Jest to najbardziej efektywny sposób buforowania, aby go użyć, możesz użyć jednej z następujących opcji w zależności od biblioteki powiązań Pythona, którą wybierzesz dla pamięci podręcznej -

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',
   }
}

Buforowanie całej witryny

Najprostszym sposobem użycia pamięci podręcznej w Django jest buforowanie całej witryny. Odbywa się to poprzez edycję opcji MIDDLEWARE_CLASSES w pliku settings.py projektu. Do opcji należy dodać:

MIDDLEWARE_CLASSES += (
   'django.middleware.cache.UpdateCacheMiddleware',
   'django.middleware.common.CommonMiddleware',
   'django.middleware.cache.FetchFromCacheMiddleware',
)

Zwróć uwagę, że kolejność jest tutaj ważna, aktualizacja powinna nastąpić przed pobraniem oprogramowania pośredniego.

Następnie w tym samym pliku musisz ustawić -

CACHE_MIDDLEWARE_ALIAS – The cache alias to use for storage.
CACHE_MIDDLEWARE_SECONDS – The number of seconds each page should be cached.

Buforowanie widoku

Jeśli nie chcesz buforować całej witryny, możesz buforować określony widok. Odbywa się to za pomocącache_pagedekorator, który pochodzi z Django. Powiedzmy, że chcemy buforować wynikviewArticles zobacz -

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)

Jak widzisz cache_pagezajmuje liczbę sekund, przez które wynik widoku ma być buforowany jako parametr. W powyższym przykładzie wynik będzie przechowywany w pamięci podręcznej przez 15 minut.

Note - Jak widzieliśmy wcześniej, powyższy widok był odwzorowany na -

urlpatterns = patterns('myapp.views',
   url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 'viewArticles', name = 'articles'),)

Ponieważ adres URL przyjmuje parametry, każde inne wywołanie będzie buforowane osobno. Na przykład żądanie do / myapp / artykuły / 02/2007 będzie oddzielnie buforowane w / myapp / artykuły / 03/2008.

Buforowanie widoku można również wykonać bezpośrednio w pliku url.py. Następnie następujący wynik ma taki sam wynik jak powyższy. Po prostu edytuj swój plik myapp / url.py i zmień powiązany mapowany adres URL (powyżej) na -

urlpatterns = patterns('myapp.views',
   url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 
   cache_page(60 * 15)('viewArticles'), name = 'articles'),)

I oczywiście nie jest już potrzebne w myapp / views.py.

Buforowanie fragmentu szablonu

Możesz również buforować części szablonu, odbywa się to za pomocą rozszerzenia cacheetykietka. Weźmy naszehello.html szablon -

{% 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 %}

Aby buforować blok treści, nasz szablon stanie się -

{% 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 %}

Jak widać powyżej, tag pamięci podręcznej przyjmuje 2 parametry - czas, w którym blok ma być buforowany (w sekundach) i nazwę fragmentu pamięci podręcznej.