V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
hustlzp
V2EX  ›  Python

Flask中如何记录user的最后在线时间?

  •  
  •   hustlzp ·
    hustlzp · 2013-12-09 14:50:15 +08:00 · 5081 次点击
    这是一个创建于 4002 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在user model中增加个last_active字段,然后在before_requrest中(或者加个中间件)更新此字段?

    这样感觉给database的压力有点大。

    或者每次request存进redis?然后再定时存入数据库?

    没接触过redis,只是大概知道它是干什么的。

    想听听大家的建议...
    第 1 条附言  ·  2013-12-09 16:13:17 +08:00
    before_request不能用...这时候request_context都还没有...
    19 条回复    1970-01-01 08:00:00 +08:00
    passluo
        1
    passluo  
       2013-12-09 15:01:21 +08:00
    Flask-Security 有

    Last login date
    Current login date
    Last login IP address
    Current login IP address
    Total login count

    都是直接扔数据库的。。。
    hustlzp
        2
    hustlzp  
    OP
       2013-12-09 15:11:35 +08:00
    @passluo 谢谢推荐!
    hustlzp
        3
    hustlzp  
    OP
       2013-12-09 15:26:29 +08:00
    @passluo 看了下Flask-Security的源代码,它是在每次调用login_user的时候记录:

    https://github.com/mattupstate/flask-security/blob/develop/flask_security/utils.py
    passluo
        4
    passluo  
       2013-12-09 16:10:48 +08:00
    我好像理解错LZ的意思的了 =。=

    但是很多应用确实是记录你最后一次「登陆」的时间,你记录最后一次「请求」的时间有什么用呢?
    hustlzp
        5
    hustlzp  
    OP
       2013-12-09 16:15:35 +08:00
    @passluo 登录的时候有“一周内自动登录”的选项。

    这样的话在登录的时候记录就有点不准了,因为user可以在一周内不用登录就上线。
    hustlzp
        6
    hustlzp  
    OP
       2013-12-09 16:16:52 +08:00
    @passluo 是客户要求记录的...他想准确记录用户最近的活跃时间...
    9hills
        7
    9hills  
       2013-12-09 16:31:17 +08:00   ❤️ 1
    @hustlzp 每次会话结束后都记录对数据库压力略大,可以用redis/memcache

    override after_request 方法就好了
    passluo
        8
    passluo  
       2013-12-09 16:48:30 +08:00   ❤️ 1
    @hustlzp

    你可以通过分析 apache 或者 nginx 的 log 来实现这个需求,不一定要动数据库的。

    比如 apache 的 access log和 cookie log

    换个思路试试? :)
    hustlzp
        9
    hustlzp  
    OP
       2013-12-09 18:13:37 +08:00
    @9hills 谢谢提醒!teardown_request也是可以的吧,只要在request还没有消失之前
    hustlzp
        10
    hustlzp  
    OP
       2013-12-09 18:16:07 +08:00
    @passluo 这个思路倒没考虑过 thx
    Shieffan
        11
    Shieffan  
       2013-12-09 18:20:04 +08:00 via iPhone   ❤️ 1
    session 设一个短的过期时间,每次设置session的时候写入登录时间及IP到redis
    meta
        12
    meta  
       2013-12-10 14:20:59 +08:00   ❤️ 1
    就算timestamp8字节,用户ID8字节,这样就算100万用户也才16MB的数据,放在内存里面定期同步到数据库不好吗。
    hustlzp
        13
    hustlzp  
    OP
       2013-12-10 21:55:00 +08:00
    @meta 好...没说不好...
    hustlzp
        14
    hustlzp  
    OP
       2013-12-10 21:55:34 +08:00
    发现也可以订阅Flask发出的request_started信号,这个时候request context刚刚建立起来,但还没有做任何的url dispatch。在这里记录登录时间和IP是蛮不错的!
    hustlzp
        15
    hustlzp  
    OP
       2013-12-10 21:56:57 +08:00
    可以把 “记录用户登录时间/IP” 和 “用户在线” 一起做,都扔进redis里。
    nightsailer
        16
    nightsailer  
       2013-12-13 13:07:56 +08:00
    哎呀,有那么复杂吗,也不是土豪,没几个用户和并发吧。

    我的做法很简单啊,新session创建的时候,如果用户属于自动登录,更新对应session的用户的登录属性或字段。否则,session登录时候再更新对应用户。

    BTW,要啥Redis,没几个用户就担心啥数据库鸭梨,我相信能问这个问题的应用,用户量也就十万级了不得,并发2位数吧。
    所以,先用最简单的方式实现,等你用户上去了,数据库已经调优不行了,再考虑引入复杂的方案。
    hustlzp
        17
    hustlzp  
    OP
       2013-12-13 18:51:37 +08:00
    @nightsailer 有道理...过度优化
    hustlzp
        18
    hustlzp  
    OP
       2013-12-13 18:53:15 +08:00
    @nightsailer 话说,终于冒泡了?看你的主页是第一次回复啊
    joey1988
        19
    joey1988  
       2014-01-27 19:02:46 +08:00
    数据库里面保存一个时间。 用户登录后,取数据库里面的时间保存在session里面。 页面上使用的上次登录时间就用session里面的。 然后数据库里面更新现在的时间。 我之前就是用这个思路的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   965 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:25 · PVG 04:25 · LAX 12:25 · JFK 15:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.