سلام این اولین پست من در ویرگول و برای شروع فعالیتم میخواستم تجربه ای که امروز برای پیاده سازی caching در Django داشتم براتون بنویسم.
خب برای شروع باید بگم که من یه RESTful API با DRF پیاده سازی کردم که همه VIEW ها هم از ModelViewSet ارث بری داشتن :
from rest_framework.viewsets import ModelViewSet from .models import CommentsModel from .serializers import CommentsALLSerializer class CommentsViewSet(ModelViewSet): queryset = CommentsModel.objects.all() serializer_class = CommentsALLSerializer http_method_names = ['get'] permission_classes = (AllowAny,)
خب با توجه با Document خوده Django که خیلی هم خوب توضیح داده وقتی بخواید یه view رو cache کنید فقط کافیه یه از method_decorator و cache_page استفاده کنید ولی مشکل وقتی ایجاد میشه که view های ما تابع نیستن .
برای همین شما باید چند متدی رو که میخوایید caching روشون انجام بشه رو override کنید.
من کدم رو به این شکل تغییر دادم :
class CommentsViewSet(ModelViewSet): queryset = CommentsModel.objects.all() serializer_class = CommentsALLSerializer http_method_names = ['get'] permission_classes = (AllowAny,) @method_decorator(cache_page(60 * 60 * 5)) def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs)
با استفاده از متد dispatch من همزمان میتونم متد های list و retrieve رو cache کنم البته تصمیم با شماست اگر بخواید میتونید decorator ها رو روی این متد ها اعمال کنید .
برای انتخاب نحوه caching هم Django روش های متنوعی رو مثال زده ولی چیزی از redis نگفته با یکم سرچ من این repository رو پیدا کردم که تمام نیاز هام رو رفع می کرد همچنین Document نسبتا خوبی داره که من پیشنهاد میکنم ازش استفاده کنید.
امیدوارم کمک خوبی کرده باشم .