阿小信大人的头像
Life is short (You need Python) Bruce Eckel

Django使用session实现在线人数统计2014-09-02 06:24

一直想在博客实现这个功能,一直没做。博客复活不找点事做对不起我每天逃课都被点名。面试的时候面试官也问过极客大挑战平台的同时在线人数的情况,我都没有实现,今天把它搞定了。

思路是这样的,因为貌似Django里没有类似JSP里面application对象这种全局变量,只好利用session。所有session都自动保存在django_session这张表里,三个字段:"session_key"(sessionid)、"session_data"(当前session中的属性)、"expire_date"(过期时间)。get_decoded()方法可以返回解码后的session_data,字典形式:{"visitor_id":1, "online":1}。每个访客都有自己的session保存在session表里,可以通过用户访问的视图保存一个session值,标记该用户正在访问网站,session过期时间设置为10分钟,标记session后会自动存到数据库。显示在线人数时从session表里面按照过期时间大于当前时间取出所有session,统计总的session个数就是在线人数,当然这个不准确,只能说是10分钟里访问了网站的同学,实时在线人数是小于等于这个值的。

1.设置session过期时间为10分钟,在settings中添加SESSION_COOKIE_AGE=60*10 #10 mins

2.在访客对网站进行操作的必经之路上保存他的在线状态

from django.contrib.sessions.backends.db import SessionStore

visitor = save_visitor(request, refere)
#request.session["online"] = visitor.id
s = SessionStore()  #不这样的话不知道为什么第一个在线访客无法获取到保存的cookie值,必须要刷新页面才能在线人数为1,否则是0
s["online"] = visitor.id
s.save()

将访客的id作为session['online']的值以便后面可以显示在线访客的具体信息

3.获取在线人数

from django.contrib.sessions.models import Session

online_sessions = Session.objects.filter(expire_date__gte=datetime.datetime.now())  #获取未过期的sessions
online_visitor_ids = [os.get_decoded().get('online', visitor.id) for os in online_sessions]  #从session对象中获取保存的访客id 
##get_decoded()第一次返回的是{},刷新后才能获取值,SessionStore save了就有值了,怪怪的
online_visitors = Visitor.objects.filter(id__in=online_visitor_ids)  #所有在线的访客

4.前端显示

<li>
    <a href="javascript:void(0)" id="online-visitors" title="点击显示在线访客">在线访客<span class="pull-right">[{{online_visitors.count}}]</span></a>
    <ul>
        {% for visitor in online_visitors %}
            <small><li>{{visitor}}<span class="pull-right">{{visitor.visited}}</span></li></small>
        {% endfor %}
    </ul>
</li>

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#Python#   #django
分享到:
阅读[3472] 评论[0]

你可能也感兴趣的文章推荐

本文最近访客

发表评论