Django ішіндегі жеке үлгі нысандары үшін кэштеу сипатына арналған тұрақты батареяның django_model_cached_property шығарылымын енгізу.
Мен evileg_core құрамында ұқсас функция бар екенін айттым, бірақ енді мен бұл кэштеуді бөлек пакетке енгізуді шештім. Бұл менің мұндай үлкен пакетті ұстауға уақытым жоқ екеніне байланысты және мен басқа жобаларымда бөлек шағын функционалдылықты қолданамын. Сондықтан, мен үшін үлкен жобаны тәуелсіз жобаларға бөлу қисынды болып көрінді, осылайша, ең болмағанда, ең болмағанда өз жобаларымның аясында ең көп сұралатын функционалдылықты қолдау оңайырақ болады. Сондай-ақ бұл пакет басқа әзірлеушілер үшін өте пайдалы болады деп үміттенемін.
Мақсат
Бума пайдаланушы сұрауы өңделіп жатқан кезде нысан данасы бар кезеңнен ұзағырақ мерзімге үлгі нысаны әдістерінің нәтижесін кэштеу үшін пайдаланылады. Бұл деректер базасының ауыр сұрауларын кэштеу үшін қажет, олардың нәтижелері теориялық тұрғыдан жиі өзгермеуі керек, бірақ сонымен бірге оларды пайдаланушы сұраулары сайын шақыру пайдаланушының Django қосымшасымен жұмыс жылдамдығын айтарлықтай төмендетуі мүмкін. Бұл, мысалы, дерекқордағы Жалпы қарым-қатынастар пайдаланылған жағдайда, пайдаланушыға нысанды ұнатқан-ұнамағаны, сондай-ақ ұнатулар саны туралы ақпарат алу үшін пайдалы болуы мүмкін. Өкінішке орай, мұндай байланыстар біз қалағандай жылдам жұмыс істемейді. Сондықтан дұрыс кэштеу сайтты айтарлықтай жылдамдатуы мүмкін.
Енді мен бұл функцияны қалай пайдалану керектігін айтамын.
Орнату
pip install -U django-model-cached-property
Талаптарды орнату және конфигурациялау
Кэштеу үшін redis орнатыңыз.
sudo apt install redis-server
Джанго жобасының setup.py параметрін конфигурациялаңыз.
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } }
Қолдану
Пакетте екі функция бар:
model_cached_property
- бұл бөлек жазбалар үшін сипатқа шақыру нәтижелерін кэштейтін сынып әдістерінің декораторы.
invalidate_model_cached_property
- бұл үлгі жазба сипатындағы әдісті жарамсыз деп тануға арналған функция.
үлгі_кэштелген_сипат
Бұл декораторды келесі жолмен пайдалануға болады.
from django_model_cached_property import model_cached_property class Article(models.Model): @model_cached_property def comments_count(self): return self.comments.count()
Бұл сіздің Django жобаңыздағы мақаланың әрбір жазбасы үшін түсініктемелерді кэштеуді білдіреді.
Кэш күту уақытын 3000 секундқа келесі жолмен орнатуға болады.
class Article(models.Model): @model_cached_property(timeout=3000) def comments_count(self): return self.comments.count()
Әдепкі бойынша, кэштеу күту уақыты 60 секундты құрайды, оны settings.py арқылы ғаламдық деңгейде орнатуға болады.
MODEL_CACHED_PROPERTY_TIMEOUT = 300000
Бұған қоса, енгізу аргументтері бар үлгі сипатын кэштеуді пайдалануға болады.
Және бұл жағдайда кэштеу дәлелдердің барлық кіріс жиындары үшін бағаланады.
Мысалы, аутентификацияланған пайдаланушы кэштеу.
class Article(models.Model): @model_cached_property def __user_in_bookmarks(self, user): return self.bookmarks.filter(user=user).exists() def user_in_bookmarks(self, user): return self.__user_in_bookmarks(user) if user.is_authenticated else False
үлгінің_кэштелген_сипатын жарамсыз
Бұл функция дерекқордағы бір үлгі жазбасы үшін сипаттағы барлық кэш кілттерін жарамсыз етеді.
Мысалы
article = get_object_or_404(Article, pk=12) invalidate_model_cached_property(article, article.comments_count)
Бұл жағдайда сіз 2 негізгі кілті бар мақаланың барлық кэштелген кілттерін жарамсыз етесіз.
ЕСКЕРТУ - Шектеу
Бұл кэштеу функциясының шектелуі оны тек бірегей енгізу аргументтерімен пайдалануға болатындығынан тұрады.
Бұл AnonymousUser нысанымен жұмыс істемейтінін білдіреді, өйткені әрбір сұрауда AnonymousUser нысаны туралы ақпарат әртүрлі болады, бірақ оны бір пайдаланушы шақырады.
Сондықтан оны тек бірегей ақпаратта пайдаланыңыз.
Қорытынды
Құрметті EVILEG веб-сайтының пайдаланушылары, егер бұл сізге қиын болмаса, жоба репозиторийін GitHub арқылы жұлдызшамен бағалаңыз.
О хорошая статья. Для какой ветки Django будет работать эта батарейка?
Я тестировал только на Django 4, но сам код не менялся пожалуй с версии Django 2, так что предполагаю, что должно работать во всех версиях, но если протестируете на более ранних версиях, и будет нормально работать, то дайте фидбек. Спасибо.