بخش های اصلی

آموزش Django

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 سیستم ذخیره سازی در حافظه ی نهان خودش را داره که این امکان را به شما میده که صفحه های داینامیک را ذخیره کنین تا مجبور نباشین در مواقعی که به آن ها نیاز دارین دوباره آن ها را محاسبه کنین – مزیت فریم ورکِ Cache مربوط به Django اینه که می توانید موارد زیر را در حافظه ی نهان ذخیره کنین:

  •  خروجی یک viewیِ خاص
  •  بخشی از یک template
  •  تمام سایت

در Django برای استفاده از حافظه ی نهان، اولین کاری که باید انجام بدین اینه که محلی که قراره ذخیره سازی انجام بشه را مشخص کنین. فریم ورکِ cache، امکانات مختلفی را ارائه میده – حافظه ی نهان می تواند پایگاه داده را در فایل سیستم یا مستقیماً در حافظه ذخیره کنه. تنظیمات در فایلِ settings.py انجام میشن.

نصب و راه اندازی Cache در پایگاه داده

کد زیر را در فایلِ settings.py اضافه کنین:

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

برای این که این کد کار کنه و تنظیمات کامل بشن، باید، جدولِ cacheای را با نامِ 'my_table_name' ایجاد کنیم. برای انجام این کار از کد زیر استفاده کنین –

python manage.py createcachetable

تنظیمِ Cache در فایل سیستم

فقط کد زیر را در فایلِ settings.py مربوط به پروژه اضافه کنین –

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

تنظیمِ Cache در حافظه (memory)

این روش مؤثرترین روشِ caching است، برای استفاده از این روش می توانید بسته به کتابخانه ی binding مربوط به Pythonای که برای حافظه ی نهانِ memory انتخاب کردین، از یکی از آپشن های زیر استفاده کنین –

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      'LOCATION': '127.0.0.1:11211',
   }
}

یا

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      'LOCATION': 'unix:/tmp/memcached.sock',
   }
}

ذخیره سازی تمام سایت در حافظه ی نهان

در Django، ساده ترین روش استفاده از cache، ذخیره سازی کل سایت در حافظه ی نهانِه. این کار با تغییر آپشنِ MIDDLEWARE_CLASSES در فایلِ settings.py مربوط به پروژه امکان پذیره. باید کد زیر را به این آپشن اضافه کنین:

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

در نظر داشته باشین که ترتیب نوشتن این کد مهمِه، Upadate باید قبل از Fetch میانی بیاد.

سپس باید در همان فایل تغییرات زیر را نیز انجام بدین:

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

ذخیره سازی یک View در حافظه ی نهان

اگه نمی خواین تمام سایت را در حافظه ی نهان ذخیره کنین، می توانید یک view خاص را ذخیره کنین. این کار با استفاده از cache_page decorator که در Django وجود داره، قابل انجامه. فرض می کنیم که می خوایم نتیجه ی viewیِ viewArticle را در حافظه ی نهان ذخیره کنیم –

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، تعداد ثانیه هایی که می خواین نتیجه ی view، بعنوان یک پارامتر در حافظه ی نهان ذخیره بشه را نگه میداره. در مثال بالا نتیجه برای مدت 15 دقیقه در حافظه ی نهان ذخیره میشه.

نکته – همانطور که پیش تر نیز دیدید، viewیِ بالا بصورت زیر map میشه:

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

از آن جایی که URL، پارامترها را میگیره، هر فراخوانی متفاوتی بصورت جداگانه در حافظه ی نهان ذخیره میشه. برای مثال درخواستِ /myapp/articles/02/2007 بصورتِ مجزا از درخواستِ /myapp/articles/03/2008 ذخیره میشه.

ذخیره سازی view در حافظه ی نهان می تواند مستقیماً در فایلِ url.py انجام بشه که نتیجه ی آن دقیقاً نتیجه ی روش بالا خواهد بود. فقط فایلِ myapp/url.py را ویرایش کنین و Url، map شده ی مرتبط (بالا) را به صورت زیر تغییر بدین :

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 به آن احتیاجی نخواهید داشت.

ذخیره سازیِ یک Template Fragment در حافظه ی نهان

می توانید بخش های یک template را هم در حافظه ی نهان ذخیره کنین، این کار با استفاده از تگِ cache قابل انجامه. در ادامه templateای با نامِ 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 %}

و برای ذخیره سازیِ block در حافظه ی نهان، template بصورت زیر خواهد بود –

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

همانطور که در بالا می بینین، تگِ cache دو پارامتر میگیره – زمانی که block را در حافظه ی نهان ذخیره می کنین (در واحد ثانیه) و نامی که به cache fragment میدین.

مبحث آموزشی

آموزش Django

Learn Django

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

تبلیغات

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد