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