Amer Abdallah نشر 24 سبتمبر 2021 أرسل تقرير نشر 24 سبتمبر 2021 (معدل) لدي وسم 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') لكن ذاكرة التخزين المؤقت تبقى صالحة! ويظهر المحتوى القديم أيضًا، ما الخطأ هنا؟ وما هي الطريقة الصحيحة لإبطال التخزين المؤقت في جوء معين؟ تم التعديل في 24 سبتمبر 2021 بواسطة Amer Abdallah 2 اقتباس
1 سامح أشرف نشر 24 سبتمبر 2021 أرسل تقرير نشر 24 سبتمبر 2021 هذا لأن المفتاح الفعلي للبيانات المؤقتة ليس "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]) 2 اقتباس
0 محمد أبو عواد نشر 24 سبتمبر 2021 أرسل تقرير نشر 24 سبتمبر 2021 كما قال سامح لأن المفتاح الفعلي ليس "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) 1 اقتباس
السؤال
Amer Abdallah
لدي وسم cache في القالب الرئيسي في مشروع جانغو Django:
عندما أقوم بإضافة منشور جديد من خلال لوحة تحكم جانغو Django، أريد إبطال ذاكرة التخزين المؤقت هذه، وبالتالي يظهر المحتوى الأحدث:
لكن ذاكرة التخزين المؤقت تبقى صالحة! ويظهر المحتوى القديم أيضًا، ما الخطأ هنا؟ وما هي الطريقة الصحيحة لإبطال التخزين المؤقت في جوء معين؟
تم التعديل في بواسطة Amer Abdallah2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.