Django - การแคช

ในการแคชบางสิ่งคือการบันทึกผลลัพธ์ของการคำนวณที่มีราคาแพงเพื่อที่คุณจะได้ไม่ดำเนินการในครั้งต่อไปที่คุณต้องการ ต่อไปนี้เป็นรหัสหลอกที่อธิบายวิธีการทำงานของแคช -

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 มาพร้อมกับระบบแคชของตัวเองที่ให้คุณบันทึกเพจแบบไดนามิกเพื่อหลีกเลี่ยงการคำนวณซ้ำเมื่อจำเป็น จุดดีใน Django Cache framework คือคุณสามารถแคช -

  • ผลลัพธ์ของมุมมองเฉพาะ
  • เป็นส่วนหนึ่งของเทมเพลต
  • ทั้งไซต์ของคุณ

ในการใช้แคชใน Django สิ่งแรกที่ต้องทำคือตั้งค่าตำแหน่งที่แคชจะอยู่ กรอบงานแคชมีความเป็นไปได้ที่แตกต่างกัน - สามารถบันทึกแคชในฐานข้อมูลบนระบบไฟล์หรือโดยตรงในหน่วยความจำ การตั้งค่าเสร็จสิ้นในไฟล์settings.py ไฟล์โครงการของคุณ

การตั้งค่าแคชในฐานข้อมูล

เพียงเพิ่มสิ่งต่อไปนี้ในไฟล์โปรเจ็กต์ settings.py -

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

เพื่อให้สามารถใช้งานได้และเพื่อให้การตั้งค่าเสร็จสมบูรณ์เราจำเป็นต้องสร้างตารางแคช 'my_table_name' สำหรับสิ่งนี้คุณต้องทำสิ่งต่อไปนี้ -

python manage.py createcachetable

การตั้งค่าแคชในระบบไฟล์

เพียงเพิ่มสิ่งต่อไปนี้ในไฟล์โปรเจ็กต์ settings.py -

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

การตั้งค่าแคชในหน่วยความจำ

นี่เป็นวิธีแคชที่มีประสิทธิภาพที่สุดในการใช้งานคุณสามารถใช้หนึ่งในตัวเลือกต่อไปนี้ขึ้นอยู่กับไลบรารีการผูก Python ที่คุณเลือกสำหรับแคชหน่วยความจำ -

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

การแคชทั้งไซต์

วิธีที่ง่ายที่สุดในการใช้แคชใน Django คือการแคชทั้งไซต์ ทำได้โดยแก้ไขตัวเลือก MIDDLEWARE_CLASSES ในโปรเจ็กต์ settings.py จำเป็นต้องเพิ่มสิ่งต่อไปนี้ในตัวเลือก -

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

โปรดทราบว่าลำดับมีความสำคัญที่นี่การอัปเดตควรมาก่อน Fetch มิดเดิลแวร์

จากนั้นในไฟล์เดียวกันคุณต้องตั้งค่า -

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

การแคชมุมมอง

หากคุณไม่ต้องการแคชทั้งไซต์คุณสามารถแคชมุมมองเฉพาะได้ ซึ่งทำได้โดยใช้ไฟล์cache_pageมัณฑนากรที่มาพร้อมกับ Django ให้เราบอกว่าเราต้องการแคชผลลัพธ์ของไฟล์viewArticles ดู -

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)

อย่างที่เห็น cache_pageใช้เวลาจำนวนวินาทีที่คุณต้องการให้แคชผลการดูเป็นพารามิเตอร์ ในตัวอย่างของเราด้านบนผลลัพธ์จะถูกแคชเป็นเวลา 15 นาที

Note - อย่างที่เราเคยเห็นมาก่อนมุมมองด้านบนคือแผนที่ไป -

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

เนื่องจาก URL ใช้พารามิเตอร์การเรียกแต่ละครั้งจะถูกแคชแยกกัน ตัวอย่างเช่นคำขอไปยัง / myapp /icles / 02/2007 จะถูกแคชแยกต่างหากไปที่ / myapp /icles / 03/2008

การแคชมุมมองสามารถทำได้โดยตรงในไฟล์ url.py จากนั้นสิ่งต่อไปนี้จะได้ผลลัพธ์เช่นเดียวกับข้างต้น เพียงแก้ไขไฟล์ myapp / url.py ของคุณและเปลี่ยน URL ที่แมปที่เกี่ยวข้อง (ด้านบน) เป็น -

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

และแน่นอนว่ามันไม่จำเป็นอีกต่อไปใน myapp / views.py

การแคชส่วนของเทมเพลต

คุณยังสามารถแคชบางส่วนของเทมเพลตได้โดยใช้ไฟล์ cacheแท็ก ลองใช้hello.html แม่แบบ -

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

และในการแคชบล็อกเนื้อหาเทมเพลตของเราจะกลายเป็น -

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

ดังที่คุณเห็นด้านบนแท็กแคชจะใช้ 2 พารามิเตอร์ - เวลาที่คุณต้องการให้บล็อกแคช (เป็นวินาที) และชื่อที่จะกำหนดให้กับส่วนแคช