python - 如何利用django的session框架实现合理地统计浏览量和点赞
巴扎黑
巴扎黑 2017-04-17 17:11:04
[Python讨论组]

使用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)
巴扎黑

可以选择存表或走缓存或走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等入手,加之限制)

巴扎黑

http://blockchaindev.org

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

仅供参考

迷茫

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号