Django

نمایش تعداد بازدیدکنندگان در سایت جنگویی | روش اول

نمایش تعداد بازدیدکنندگان در سایت جنگویی

در این آموزش سریع ما می خواهیم یاد بگیریم که چگونه تعداد بازدیدها را برای اشیا خاص ردیابی کنیم که بسیار مفید است. وقتی کاربر وارد برنامه شما می شود ، تعداد بازدیدها می تواند کاربر را به سمت کلیک کردن روی پست های خاص و خواندن آن سوق دهد. همچنین خوب است که محبوب ترین پست ها را به کاربران نشان دهید.

من برای رسیدن به این هدف سایت های زیادی را بررسی کردم و راه حل های زیادی برای اینکار پیدا کردم سعی خواهم کرد تمام این راه حل ها طی چند مقاله در سایت ارور وب قرار بدم سعی هم خواهم کرد نقاط ضعف و قوت هر کدام از این روش ها را نیز بررسی کنم.

روش اول برای نمایش تعداد بازدیدکنندگان آنلاین در وب سایت django در قالب (template):

در ابتدا باید مدل مربوط را بسازم تا جدول مورد نیاز در دیتابیس ایجاد شود:

class Visitor_Info(models.Model):
    ip_address = models.GenericIPAddressField()
    page_visited = models.TextField()
    event_date = models.DateTimeField(default=datetime.now)

بعد از ساختن مدل نوبت به ساختن یک پردازنده ی زمینه ( context_processors ) می رسد.یک فایل با نام processor.py ایجاد میکنیم.

from django.conf import settings
from .models import Visitor_Info

import socket
import random

def save_visitor_info(request):
    context_nb_vistors = 0
    #----- get visitor ip -----#
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')    
    #----- check if ip adress is valid -----#
    try:
        socket.inet_aton(ip)
        ip_valid = True
    except socket.error:
        ip_valid = False
    #----- check if ip adress is valid -----#
    if ip_valid:
        do something

    return {"context_nb_vistors":context_nb_vistors}

این پردازنده ی زمینه ( context_processors ) ابتدا IP بازدید کننده را دریافت میکند سپس چک میکنید که IP ها valid یا معتبر هست یا خیر.

خطوط زیر را نیز اضافه میکنیم.

present_date = datetime.datetime.now()
ref_date_1 = present_date - datetime.timedelta(days=1)
ref_date_2 = present_date - datetime.timedelta(days=2)

حالا باید برای اینکه اگر یک بازدید کننده جدید از صفحه ای بازدید کرد این بازدید در دیتابیس ذخیره گردد، باید کد زیر را به پردازنده زمینه خود اضافه کنیم.

if Visitor_Info.objects.filter(ip_address=ip, page_visited=request.path, event_date__gte=ref_date_1).count() == 0:
    new_visitor_info = Visitor_Info(
    ip_address = ip,
    page_visited = request.path,
    event_date = present_date)          
    new_visitor_info.save()

اگر بازدید کننده به همان صفحات برگردد قصد داریم تاریخ آن بروزرسانی گردد یعنی اخرین تاریخ حضور در این برگه توسط همان کاربر بروز گردد که با کد زیر در processor.py اتفاق خواهد افتاد.

if Visitor_Info.objects.filter(ip_address=ip, page_visited=request.path, event_date__gte=ref_date_1).count() == 1:
    visitor_info_obj = Visitor_Info.objects.get(ip_address=ip, page_visited=request.path, event_date__gte=ref_date_1)
    visitor_info_obj.event_date = present_date
    visitor_info_obj.save()

حالا در بخش settings.py در قسمت TEMPLATES و سپس OPTIONS و در بخش context_processors باید پردازنده ی زمینه ( context_processors ) را معرفی کنیم.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'myapp.processor.save_visitor_infos',
            ],
        },
    },
]

نکته: اگر از قبل، از برنامه دیگری برای این کار استفاده می کردید آن را غیر فعال کنید.

یافتن تعداد بازدیدکنندگان:

برای پیدا کردن تعداد بازدیدکنندگان آنلاین ، می توانیم به عنوان مثال تعداد بازدیدکنندگان فعال در 5 دقیقه گذشته را بدست آوریم فقط کافی است کد های زیر را نیز به processor.py خود اضافه کنیم:

ref_date = present_date - datetime.timedelta(minutes=5) 
context_nb_vistors = Visitor_Info.objects.filter(event_date__gte=ref_date).values_list('ip_address', flat=True).distinct().count()
return {"context_nb_vistors":context_nb_vistors}

نکته: تابع distinct برای حذف نسخه تکراری استفاده شده است.

برای نمایش تعداد بازدیدکنندگان در قالب کافی است کد زیر را در هرجای قالب HTML که برای اینکار درنظر گرفته ایم وارد کنیم:

{{context_nb_vistors}}

پس در مجموع کد ما در فایل processor.py به صورت زیر خواهد شد.

from django.conf import settings
from .models import Visitor_Info

import socket
import random

def save_visitor_info(request):
    try:
        #----- get visitor ip -----#
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')    
        #----- check if ip adress is valid -----#
        try:
            socket.inet_aton(ip)
            ip_valid = True
        except socket.error:
            ip_valid = False
        #----- check if ip adress is valid -----#
        if ip_valid:

            present_date = datetime.datetime.now()
            ref_date_1 = present_date - datetime.timedelta(days=1)
            ref_date_2 = present_date - datetime.timedelta(days=2)

            if Visitor_Info.objects.filter(ip_address=ip, page_visited=request.path, event_date__gte=ref_date_1).count() == 0:
                new_visitor_info = Visitor_Info(
                ip_address = ip,
                page_visited = request.path,
                event_date = present_date)          
                new_visitor_infos.save()

            if Visitor_Info.objects.filter(ip_address=ip, page_visited=request.path, event_date__gte=ref_date_1).count() == 1:
                visitor_info_obj = Visitor_Info.objects.get(ip_address=ip, page_visited=request.path, event_date__gte=ref_date_1)
                visitor_info_obj.event_date = present_date
                visitor_info_obj.save()
    except:
        pass

    context_nb_vistors = 0
    ref_date = present_date - datetime.timedelta(minutes=5) 
    context_nb_vistors = Visitor_Infos.objects.filter(event_date__gte=ref_date).values_list('ip_address', flat=True).distinct().count()

    return {"context_nb_vistors":context_nb_vistors}

برای یادگیری نمایش تعداد بازدیدکنندگان در سایت جنگویی | روش دوم بر روی لینک کلیک کنید

کلمات کلیدی:نمایش تعداد بازدیدکنندگان در سایت جنگویی،نمایش بازدیدکنندگان در جنگو

امیرحسین باقری

امیرحسین باقری هستم عاشق طراحی سایت در زمینه python و همینطور طراح قالب و متخصص فرانت اند؛ از دانشی که تو این مدت بدست آوردم میشه به: html&css , ,bootstrap, C#, flexbox , sass , javascript , Django,celery,Django channels,DRF,Ruby ,Ruby on Railsاشاره کرد.
دکمه بازگشت به بالا