我有一个带IntegerField(hit_count)的表,当访问一个页面时(例如http://site/page/3),我希望hit_count数据库中的记录ID 3的列增加1.
查询应该像:
update table set hit_count = hit_count + 1 where id = 3
Run Code Online (Sandbox Code Playgroud)
我可以使用标准的Django模型约定吗?或者我应该手动编写查询?
我注意到StackOverflow对每个问题都有一个视图计数,并且这些视图编号相当低且准确.
我的一个网站上有类似的东西.每当页面加载到后端代码中时,它基本上都会记录"命中".不幸的是,它也为搜索引擎命中率提供了膨胀和不准确的数字.
我想一种不计算机器人的方法是在页面加载后用AJAX调用进行视图计数,但我确信还有其他更好的方法可以忽略搜索引擎中的搜索引擎,同时仍让它们进入抓取您的网站.你知道任何?
我已经看过最受欢迎的Django热门计数器解决方案,它们似乎都没有解决垃圾邮件刷新按钮的问题.
我是否真的必须记录每个访问者的IP,以防止他们通过垃圾邮件刷新按钮(或编写一个快速而脏的脚本来为他们执行)来人为地提高页面查看次数?
现在,您可以使用以下几行Python代码来扩充您的视图计数.哪个太少,你真的不需要编写脚本,你只需将它输入到交互式会话中:
from urllib import urlopen
num_of_times_to_hit_page = 100
url_of_the_page = "http://example.com"
for x in range(num_of_times_to_hit_page):
urlopen(url_of_the_page)
Run Code Online (Sandbox Code Playgroud)
对我来说,当你需要在每个页面视图上对数据库进行一堆写操作时,这是一个相当粗糙的情况,但我想它无法帮助.由于一些用户人为地夸大了他们的观看次数,我将实施IP日志记录.并不是说他们是坏人,甚至是糟糕的用户.
看看有关缓存解决问题的答案......我将首先尝试这条路线.将更新结果.
值得一提的是,Stack Overflow似乎正在使用cookie(我无法增加自己的查看次数,但是当我在另一个浏览器中访问该站点时,它会增加.)
我认为这样做的好处太多了,这种"作弊"现在太容易了.
感谢大家的帮助!
在我的views.py中制作视图计数器功能的最佳方法是什么?
我确实在Django文档中找到了F()表达式,但是如何让它工作或者更好的主意呢?
先感谢您
def watch_video(request, slug):
video = get_object_or_404(Video, slug=slug)
template = "single_video.html"
#if this function will run , + 1 in Video.views ?
return render(request,template,{"video":video})
Run Code Online (Sandbox Code Playgroud)
我的模特:
class Video(models.Model):
video_id = models.CharField(max_length=150)
title = models.CharField(max_length=150)
slug = AutoSlugField(populate_from="title")
description = models.TextField(blank=True)
views = models.PositiveIntegerField(default=0)
likes = models.PositiveIntegerField(default=0)
category = models.ForeignKey("VideoCategory")
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
tags = models.ManyToManyField("Tag")
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("watch", kwargs={"slug" : self.slug})
Run Code Online (Sandbox Code Playgroud)