تتبع عدد "طرق عرض الصفحة" أو "ضربات" كائن؟

StackOverflow https://stackoverflow.com/questions/1603340

  •  05-07-2019
  •  | 
  •  

سؤال

أنا متأكد من أن شخصًا ما لديه تطبيق قابل للتوصيل (أو برنامج تعليمي) يقارب هذا ، لكن أواجه مشكلة في العثور عليه: أريد أن أكون قادرًا على تتبع عدد "طرق العرض" التي يمتلكها كائن معين (تمامًا مثل سؤال هنا على Stackoverflow لديه "عدد العرض").

إذا لم يتم تسجيل الدخول إلى المستخدم ، فلن أمانع في محاولة وضع ملف تعريف ارتباط (أو تسجيل عنوان IP) حتى لا يتمكنوا من تشغيل عدد العرض عن غير قصد عن طريق تحديث الصفحة ؛ وإذا تم تسجيل الدخول إلى المستخدم ، فسمح له فقط "عرض" واحد عبر الجلسات/المتصفحات/عناوين IP. لا أعتقد أنني بحاجة إليها أي مربيها.

أعتقد أن أفضل طريقة للقيام بذلك هي باستخدام الوسيطة التي يتم فصلها عن النماذج المختلفة التي أريد تتبعها واستخدام تعبير F (من نوع ما) - تم الإشارة إلى أسئلة أخرى على Stackoverlow إلى هذا (1) (2) (3).

لكنني أتساءل عما إذا كان هذا الرمز موجودًا في البرية بالفعل - لأنني لست أكثر برامج المبرمج ، وأنا متأكد من أن شخصًا ما يمكنه القيام بذلك بشكل أفضل. يبتسم.

هل رأيته؟

هل كانت مفيدة؟

المحلول

لست متأكدًا مما إذا كان من أفضل ذوق الإجابة على سؤالي الخاص ، ولكن بعد قليل من العمل ، قمت بتجميع تطبيق يحل المشكلات بشكل جدي: Django-hitcount.

يمكنك أن تقرأ حول كيفية استخدامه في صفحة الوثائق.

جاءت أفكار Django-Hitcount من كل من إجابتي الأصلية (TeeBes -و- Vikingosegundo) ، الأمر الذي جعلني أبدأ حقًا في التفكير في الأمر برمته.

هذه هي محاولتي الأولى لمشاركة تطبيق قابل للتوصيل مع المجتمع وآمل أن يجد شخص آخر أنه مفيد. شكرًا!

نصائح أخرى

يجب عليك استخدام إطار جلسة Django المدمجة ، وهو يقوم بالفعل بالكثير من هذا لك. لقد قمت بتطبيق هذا بالطريقة التالية مع تطبيق سؤال وجواب حيث أردت تتبع طرق العرض:

في الموديلات.:

class QuestionView(models.Model):
    question = models.ForeignKey(Question, related_name='questionviews')
    ip = models.CharField(max_length=40)
    session = models.CharField(max_length=40)
    created = models.DateTimeField(default=datetime.datetime.now())

في العروض

def record_view(request, question_id):

    question = get_object_or_404(Question, pk=question_id)

    if not QuestionView.objects.filter(
                    question=question,
                    session=request.session.session_key):
        view = QuestionView(question=question,
                            ip=request.META['REMOTE_ADDR'],
                            created=datetime.datetime.now(),
                            session=request.session.session_key)
        view.save()

    return HttpResponse(u"%s" % QuestionView.objects.filter(question=question).count())

من المحتمل أن يكون Vikingosegundo صحيحًا على الرغم من أن استخدام نوع المحتوى هو على الأرجح الحل الأكثر قابلية لإعادة الاستخدام ولكن بالتأكيد لا يعيد اختراع العجلة من حيث جلسات التتبع ، فإن Django يفعل ذلك بالفعل!

آخر شيء ، ربما يجب أن يكون لديك الرؤية التي تسجل أن الضربة تسمى إما عبر Ajax أو رابط CSS بحيث لا ترفع محركات البحث عن تهمك.

امل ان يساعد!

يمكنك إنشاء نموذج ضرب عام

class Hit(models.Model):
    date = models.DateTimeField(auto_now=True)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

في عرضك. تحكي هذه الوظيفة:

def render_to_response_hit_count(request,template_path,keys,response):
    for  key in keys:
        for i in response[key]:
             Hit(content_object=i).save()
    return render_to_response(template_path, response)

والآراء التي تهتم بها في العودة

return render_to_response_hit_count(request,   'map/list.html',['list',],
        {
            'list': l,
        })

يمنحك هذا النهج القوة ، ليس فقط لحساب الضربة ، ولكن لتصفية تاريخ النجاح حسب الوقت ، و contentType وما إلى ذلك ...

نظرًا لأن جدول الضرب قد ينمو بسرعة ، يجب أن تفكر في استراتيجية الحذف.

أعلم أن هذا السؤال قديم وأيضًا ثورنوماد وضع تطبيق لحل المشكلة وإلهامني معي. أرغب في مشاركة هذا الحل لأنني لم أجد الكثير من المعلومات حول هذا الموضوع وقد يساعد شخص آخر. إن مقاربي هو إنشاء نموذج عام يمكن استخدامه مع أي طريقة عرض بناءً على مسار العرض (URL).

النماذج

class UrlHit(models.Model):
    url     = models.URLField()
    hits    = models.PositiveIntegerField(default=0)

    def __str__(self):
        return str(self.url)

    def increase(self):
        self.hits += 1
        self.save()


class HitCount(models.Model):
    url_hit = models.ForeignKey(UrlHit, editable=False, on_delete=models.CASCADE)
    ip      = models.CharField(max_length=40)
    session = models.CharField(max_length=40)
    date    = models.DateTimeField(auto_now=True)

views.py

def get_client_ip(request):
    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')
    return ip

def hit_count(request):
    if not request.session.session_key:
        request.session.save()
    s_key = request.session.session_key
    ip = get_client_ip(request)
    url, url_created = UrlHit.objects.get_or_create(url=request.path)

    if url_created:
        track, created = HitCount.objects.get_or_create(url_hit=url, ip=ip, session=s_key)
        if created:
            url.increase()
            request.session[ip] = ip
            request.session[request.path] = request.path
    else:
        if ip and request.path not in request.session:
            track, created = HitCount.objects.get_or_create(url_hit=url, ip=ip, session=s_key)
            if created:
                url.increase()
                request.session[ip] = ip
                request.session[request.path] = request.path
    return url.hits

فعلت ذلك باستخدام ملفات تعريف الارتباط. لا أعرف ما إذا كان من الجيد القيام بذلك أم لا. يبحث الرمز التالي عن ملف تعريف الارتباط المحدد بالفعل أولاً إذا كان موجودًا ، فهو يزيد من عداد Total_View إذا لم يكن هناك يزيد من Total_Views و Quientive_Views. كل من Total_views و Quiential_Views هي حقل لنموذج Django.

def view(request):
    ...
    cookie_state = request.COOKIES.get('viewed_post_%s' % post_name_slug)
    response = render_to_response('community/post.html',context_instance=RequestContext(request, context_dict))
    if cookie_state:
        Post.objects.filter(id=post.id).update(total_views=F('total_views') + 1)
    else:
        Post.objects.filter(id=post.id).update(unique_views=F('unique_views') + 1)
        Post.objects.filter(id=post.id).update(total_views=F('total_views') + 1)
                        response.set_cookie('viewed_post_%s' % post_name_slug , True, max_age=2678400)
    return response

لقد فعلت ذلك عن طريق إنشاء مشاهدات صفحات نموذج وجعل عمود "يضرب" فيه. في كل مرة يتم فيها ضرب عنوان URL للصفحة الرئيسية. أقوم بزيادة الصف الأول والوحيد من العمود وضربه إلى القالب. هنا كيف تبدو.

views.py

def Home(request):

    if(PageView.objects.count()<=0):
        x=PageView.objects.create()
        x.save()
    else:
        x=PageView.objects.all()[0]
        x.hits=x.hits+1
        x.save()
    context={'page':x.hits}
    return  render(request,'home.html',context=context)

النماذج

class PageView(models.Model):
    hits=models.IntegerField(default=0)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top