Форумда мақалалар мен сұрақтарды құрудың басында мен осы мазмұнға қарапайым көзқарастар есептегішін қостым.
Бұл санауыш бүтін түрдегі кәдімгі өріс болды және бет сұралған сайын ол біреуге ұлғайып отырды.
Бірақ жақында мен бұл есептегішті бірегей көріністерді тіркеуге арналған есептегіш үлгісімен ауыстырдым. Мен мұны әдемірек деп ойлағандықтан жасадым.
Есептегіш бірегей кірушілерді IP мекенжайы бойынша, егер пайдаланушы сайтта рұқсат етілмеген болса, немесе осы пайдаланушы сайтта рұқсат етілген болса, пайдаланушы тіркелгісі бойынша санайды.
Ендеше мұны қалай жасау керектігін үйренейік.
Қарау үлгісі
Сайтты қараған бірегей пайдаланушыларды санауға жауапты.
class Viewer(models.Model): ipaddress = models.GenericIPAddressField("IP address", blank=True, null=True) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, blank=True, null=True)
Көріп отырғаныңыздай, бұл модельде тек екі өріс бар, біріншісі - IP мекенжайы, екіншісі - пайдаланушы үлгісінің сыртқы кілті
Мазмұн үлгісіне есептегішті қосу
Ал енді кейбір сайт мазмұны үлгісіне есептегішті қосамыз, мысалы, мақала үлгісіне Мақала
class Article(models.Model): viewers = models.ManyToManyField(Viewer) # Some another code
Код қосу «Көптен көпке» қатынасы ретінде орындалады. Өйткені бұл жағдайда бірегей келуші біреу болады, бірақ ол көптеген басқа мақалаларды көре алады. Сонымен қатар, мақаланы көптеген басқа пайдаланушылар көре алады.
Мазмұнды қарау есептегішін қалай арттыруға болады
Сірә, кейбір қарау класы немесе көру функциясы сайтыңыздағы мақалаларды көрсетуге жауапты болады. Жеке өзім Джангода заманауи Сыныпқа негізделген көрініс қолданғым келеді.
Сондықтан мен сайттағы мазмұнның бірегей көріністерін тіркеу үшін DetailView көмегімен пайдалануға болатын миксин жазамын.
class CountViewerMixin: def get(self, request, *args, **kwargs): response = super().get(request, *args, **kwargs) if hasattr(self.object, 'viewers'): viewer, created = Viewer.objects.get_or_create( ipaddress=None if request.user.is_authenticated else get_client_ip(request), user=request.user if request.user.is_authenticated else None ) if self.object.viewers.filter(id=viewer.id).count() == 0: self.object.viewers.add(viewer) return response
Кодтан миксиннің get әдісін жоққа шығаратынын, мазмұн нысанының Көріністе бар екенін тексеретінін және содан кейін ғана бірегей келушіні алатынын және келушінің көрушілер арасында әлі жоқ екенін тексергеннен кейін көруге болады. мазмұн, оны мазмұн көріністеріне қосады.
Осылайша, мазмұн үлгісіндегі бүтін өріс түріндегі есептегішке қарағанда мазмұн нысанының өзі өзгертілмейді. Егер сізде мазмұн үлгісін сақтау әдісін қайта анықтау болса немесе үлгіден сақтау сигналдарын өңдеу үшін қабылдағыш функцияларын жазған болсаңыз, кодты қиындатуы мүмкін. Осы мақалада берілген Көруші есептегіші жағдайында мазмұн үлгісіндегі post_save сияқты сигналдар жай жұмыс істемейді.
Мазмұн көрінісінде араластыру қосылымы келесідей болады:
class ArticleView(CountViewerMixin, DetailView): # some another code
Үлгіде пайдалану
Үлгі ішінде сіз келесідей көріністер санын ала аласыз
{{ object.viewers.count }}
клиент_ipін алу
Миксиннің HTTP сұрауынан IP мекенжайын алу функциясы да бар. Мен бұл арнайы функцияны [мақалалардың біріндегі сұраудан пайдаланушының IP мекенжайын алу] үшін сипаттадым (https://evileg.com/ru/post/181/).
Менің Django 3-ке арналған соңғы редакциямда ол осылай көрінеді.
def get_client_ip(request): """ Get client ip address from HTTP request :param request: HTTP request :return: IP Address """ x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') return x_forwarded_for.split(',')[-1].strip() if x_forwarded_for else request.META.get('REMOTE_ADDR')
Қорытынды
Мұндай есептегіш мазмұнды сақтауға реакцияларыңыз болса, кодты сақтауды жеңілдетеді, сонымен қатар мазмұн есептегіштеріне алдаулардың әсерін азайтады.