اذهب إلى المحتوى

السؤال

نشر

أرغب في الاحتفاظ بصفحة في ذاكرة التخزين المؤقت حتى يعلق أحد الأشخاص على إحدى المشاركات. تبدو هذه فكرة رائعة لأن الأشخاص نادرًا ما يعلقون، لذا فإن الاحتفاظ بالصفحات في memcached إلى أن يقوم أحد بعمل تعليق أمرًا رائعًا.

لذا فإن الحل الذي أفكر فيه هو:

@cache_page( 60 * 15, "blog" );
def blog( request ):
  # code ...

وبعد ذلك سأحتفظ بقائمة بجميع مفاتيح التخزين المؤقت المستخدمة لملف العرض blog وبعد ذلك يكون لدي طريقة لإنهاء مساحة ذاكرة التخزين المؤقت "blog". لكنني أتساءل عما إذا كان هناك طريقة أفضل للقيام بذلك؟

Recommended Posts

  • 1
نشر

يمكنك أن بإنشاء دالة invalidate_cache ويتم إستخدامها عندما يقوم شخص ما بتحديث منشور في المدونة، وتقوم هذه الدالة بإنشاء المفتاح المستخدم في ذاكرة التخزين المؤقت وإستخدام هذا المفتاح في حذف الذاكرة المؤقتة.

from django.core.cache import cache
from django.http import HttpRequest
from django.utils.cache import get_cache_key

def invalidate_cache(path=''):
    request = HttpRequest()
    request.META = {'SERVER_NAME':'localhost','SERVER_PORT':8000}
    request.LANGUAGE_CODE = 'en-us'
    request.path = path

    try:
        cache_key = get_cache_key(request)
        if cache_key :
            if cache.has_key(cache_key):
                cache.delete(cache_key)
                return (True, 'تم حذف الذاكرة بنجاح')
            else:
                return (False, 'المفتاح المستخدم غير موجود في ذاكرة التخزين المؤقت')
        else:
            raise ValueError('فشل في إنشاء مفتاح ذاكرة التخزين المؤقت')
    except (ValueError, Exception) as error:            
        return (False, error)

ويمكنك إستخدام هذه الدالة على النحو التالي في المكان الذي ترغب به:
 

status, message = invalidate_cache(path='/path/to/blog/route/')

 

  • 0
نشر

في النسخ الحديثة من جانغو "2.0 وما فوق" تنفيذ هكاذا أمر أصبح أسهل:

from django.utils.cache import learn_cache_key
from django.core.cache import cache
from django.views.decorators.cache import cache_page
keys = set()
@cache_page( 60 * 15, "blog" );
def blog( request ):
    response = render(request, 'template')
    keys.add(learn_cache_key(request, response)
    return response
def invalidate_cache()
    cache.delete_many(keys)

حيث يمكنك تسجيل Invate_cache كـ callback عندما يقوم شخص ما بتحديث منشور في المدونة عبر إشارة pre_save.

  • 0
نشر

يمكنك إنشاء cache_page الخاص بك كالتالي

from django.core.cache import cache


def simple_cache_page(cache_timeout):
    """
    Decorator للعرض الذي يحاول الحصول على الصفحة من ذاكرة التخزين المؤقت و
     يملأ ذاكرة التخزين المؤقت إذا لم تكن الصفحة في ذاكرة التخزين المؤقت بعد.

     يتم تمييز ذاكرة التخزين المؤقت بواسطة اسم العرض والوسيطات.
    """
    def _dec(func):
        def _new_func(*args, **kwargs):
            key = func.__name__
            if kwargs:
                key += ':' + ':'.join([kwargs[key] for key in kwargs])

            response = cache.get(key)
            if not response:
                response = func(*args, **kwargs)
                cache.set(key, response, cache_timeout)
            return response
        return _new_func
    return _dec

لذاكرة التخزين المؤقت للصفحة منتهية الصلاحية ، يمكنك استخدام

cache.set('map_view:' + self.slug, None, 0)

حيث self.slug عبارة عن معامل من urls.py 

url(r'^map/(?P<slug>.+)$', simple_cache_page(60 * 60 * 24)(map_view), name='map'), 

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...