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

السؤال

نشر (معدل)

لدي وسم cache في القالب الرئيسي في مشروع جانغو Django:

{% cache 5000 posts %}
    Content goes here
{% endcache %}

عندما أقوم بإضافة منشور جديد من خلال لوحة تحكم جانغو Django، أريد إبطال ذاكرة التخزين المؤقت هذه، وبالتالي يظهر المحتوى الأحدث:

class PostsAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        super(postsAdmin, self).save_model(request, obj, form, change)
        cache.delete('posts')

لكن ذاكرة التخزين المؤقت تبقى صالحة! ويظهر المحتوى القديم أيضًا، ما الخطأ هنا؟ وما هي الطريقة الصحيحة لإبطال التخزين المؤقت في جوء معين؟

تم التعديل في بواسطة Amer Abdallah

Recommended Posts

  • 1
نشر

هذا لأن المفتاح الفعلي للبيانات المؤقتة ليس "posts"، بل هو مفتاح يتم إنشاؤه ديناميكيًا بواسطة جانغو Django باستخدام كلمة posts مع خوارزمية md5، لذلك يوفر جانغو Django التابع make_template_fragment_key لكي تقوم بحذف البيانات المؤقتة.

يقبل التابع make_template_fragment_key مدخلين، الأول هو اسم fragment_name  هو المفتاح المعطى كاسم لهذه البيانات، وفي هذه الحالة يكون posts، بينما المعامل الثاني هو vary_on وهو قائمة بكل المعطيات التي يتم تمريرها إلى الوسم tag، ولحذف البيانات المؤقتة تقوم بعمل التالي:

from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key

# cache key for {% cache 5000 posts %}
key = make_template_fragment_key('posts')
cache.delete(key)

وإن كان لديك معطيات للوسم، فيمكنك تمريرها على النحو التالي:

# cache key for {% cache 5000 posts data %}
key = make_template_fragment_key('posts', [data])

 

  • 0
نشر

كما قال سامح لأن المفتاح الفعلي ليس "posts" ، بل هو مفتاح تم إنشاؤه ديناميكيا بواسطة Django باستخدام ما يلي:

args = md5_constructor(u':'.join([urlquote(resolve_variable(var, context)) for var in self.vary_on]))
cache_key = 'template.cache.%s.%s' % (self.fragment_name, args.hexdigest())

 سيكون المفتاح بالتنسيق: template.cache.posts.[hexdigest]. لذا فإن الجزء الصعب هو معرفة الجزء hexdigest, يمكنك استخدام الكود التالي كحل آخر

from django.core.cache import cache
from django.utils.hashcompat import md5_constructor
from django.utils.http import urlquote

def invalidate_template_cache(fragment_name, *variables):
    args = md5_constructor(u':'.join([urlquote(var) for var in variables]))
    cache_key = 'template.cache.%s.%s' % (fragment_name, args.hexdigest())
    cache.delete(cache_key)

من خلال الكود السابق يمكننا معرفة المفتاح بشكل فعلي ويمكننا ابطال ذاكرة التخزين المؤقت التي حددتها, نظرا لأنك لا تقوم بتمرير أي متغيرات ، يمكنك استدعاء ذلك فقط بـ

Invalidate_template_cache ("posts")

 بخلاف ذلك ، ستحتاج إلى تمرير قائمة بجميع المتغيرات كالتالي

invalidate_template_cache("posts", *variables)

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...