素材牛VIP会员
如何利用django的session框架实现合理地统计浏览量和点赞
 sh***ng  分类:Python  人气:944  回帖:3  发布于6年前 收藏

使用django1.9+python3.4写了一个博客,为了完善用户体验,现在想实现以下两个需求:

  • 统计每篇文章的浏览量,但是不能点击一次统计一次。因此我希望达到的效果是:同一用户,若第一次点击某篇文章则文章浏览量+1,以后对该用户的点击至少每隔3分钟才统计一次。

  • 用户点赞:用户对某篇文章点赞后,不能再次点赞

由于个人博客没有设计用户登陆注册功能,因此只能使用django的session框架,目前我实现的两段代码如下,能达到近似效果,但是和需求还是有区别,代码如下:

#实现统计浏览量的视图函数代码段
...
last_view = request.session.get('last_view')#获取最后一次浏览本站的时间last_view
    if last_view:
        last_visit_time = datetime.datetime.strptime(last_view[:-7], "%Y-%m-%d %H:%M:%S")
        if datetime.datetime.now() >= last_visit_time + datetime.timedelta(minutes=5):#判断如果最后一次访问网站的时间大于5分钟,则浏览量+1
            post.views += 1
            post.save()
    else:
        post.views += 1
        post.save()
    request.session['last_view'] = str(datetime.datetime.now())#更新session
    ...

以上代码的思路是设置用户最后一次访问网站的时间的session,下次用户访问时获取该session,如果最后一次访问网站的时间大于5分钟,则浏览量+1。这种实现存在的问题的无法区分用户访问了哪篇文章,因此统计的时间差只是用户访问全站的时间,而不是浏览某篇文章的时间间隔。有什么办法利用session框架实现第一个需求么?

#点赞视图函数
def like_post(request):
    p_id = None
    likes = 0
    LIKED = '谢谢鼓励,但你已经赞过啦!'

    if request.method == 'GET':
        p_id = request.GET['post_id']
        liked_post = request.session.get('liked')
        if p_id == liked_post:
            return HttpResponse(LIKED)
        post = get_object_or_404(Post, id=p_id)
        post.likes += 1
        likes = post.likes
        post.save()
        request.session['liked'] = p_id
        return HttpResponse(likes)

以上实现的思路是,将用户最近一次点赞的文章记录进session,但是用户一旦点赞过其他文章,那么又可以去点赞已经点赞过的文章了。请问有什么办法实现第二个需求么?

求大家提供一点实现思路,不胜感激。

讨论这个帖子(3)垃圾回帖将一律封号处理……

Lv5 码农
Ca***on 职业无 6年前#1

这种需求用session个人认为并不合理 可以选择存表或走缓存或走cookie 建议走缓存

Lv5 码农
伴***4 JAVA开发工程师 6年前#2

可以选择存表或走缓存或走cookie 建议走缓存
说这话的应该不太了解 Django,Django session都只是一个普通的Django model,可以看做是 Cookie 的服务器端缓存。具体的介绍请看参考链接

题主的问题根本原因是 保存时的 key 是全局的,没有带 ID,
如果 < Post.id>_last_view 这种形式即可

当然这不是一个很好的解决方法, 因为用户还是可以通过清除 Cookie 的方式刷赞 + 刷浏览量

参考1. http://stackoverflow.com/questions/18239816/django-difference-between-database-backed-sessions-and-cookie-based-session (英文)
参考2. http://djangobook.py3k.cn/2.0/chapter14/ (中文)

参考3. https://github.com/jsocol/django-ratelimit (一个库,从ip等入手,加之限制)

Lv6 码匠
这***生 技术总监 6年前#3

http://blockchaindev.org

https://github.com/betachen/blockchaindev.org

仅供参考

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取