我在Django中制作了一个简单的BBS应用程序,我想要它,以便每当有人看到帖子时,该帖子上的观看次数(post_view_no)就会增加。
目前,我面临两个困难:
我需要限制post_view_no的增加,以便一个用户只能增加一次,无论用户刷新/点击帖子多少次。
我还需要能够跟踪未登录的用户。
关于第一个问题,只要我创建一个名为' View'并检查数据库,但我觉得这可能是一个过度杀伤。
就第二个问题而言,我能想到的只是使用cookie / IP地址来跟踪用户,但IP并不是唯一的,我无法弄清楚如何使用cookie
我相信这是论坛/ bbs解决方案的一个常见功能,但谷歌搜索只出现了插件或“傻瓜”#39;每次查看帖子时都会增加视图的解决方案。
最好的方法是什么?
答案 0 :(得分:2)
我认为你可以通过cookies做两件事。例如,当用户访问页面时,您可以
检查他们的会话中是否设置了“Viewed_post_%s”(其中%s是帖子ID)密钥。
如果他们有,什么都不做。如果他们没有,请将相应view_count
对象的Post
数字字段加1,并在其会话中设置密钥(cookie)“seen_post_%s”(以便赢得&#39) ; t计算未来)。
这适用于匿名用户和注册用户,但是通过清除cookie或设置浏览器拒绝它们,用户可以对游戏进行游戏计数。
现在使用与Django的cookie(会话)非常简单:为当前用户设置一个值,你只需调用类似
的内容request.session['viewed_post_%s' % post.id] = True
在你看来,并完成了。 (查看docs,尤其是examples。)
免责声明:这不是我的首要任务,我个人也没有这样做,通常是在需要进行一些网页浏览/活动跟踪时(以便你知道什么会增加你网站的流量,当用户更活跃时等等。)那么使用专门的系统(例如,Google Analytics,StatsD)是有意义的。但是对于某些特定的用例,或者作为练习,这应该可行。
答案 1 :(得分:0)
只是提供一个二级解决方案,我认为它可以工作,但也很容易游戏(如果通过代理或不同的设备)。我还没试过这个,但我认为它应该有用,并且不需要考虑cookie,而且你会聚合一些额外的数据,这是noice。
我会创建一个名为TrackedPosts
的模型。
class TrackedPosts(models.Model):
post = models.ForeignKey(Post)
ip = models.CharField(max_length=16) #only accounting for ipv4
user = models.ForeignKey(User) #if you want to track logged in or anonymous
然后当你查看帖子时,你会接受请求ip。
def my_post_view(request, post_id):
#you could check for logged in users as well.
tracked_post, created = TrackedPost.objects.get_or_create(post__pk=id, ip=request.ip, user=request.user) #note, not actual api
if created:
tracked_post.post.count += 1
tracked_post.post.save()
return render_to_response('')