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

2013-12-09 14:50:15 +08:00
 hustlzp
在user model中增加个last_active字段,然后在before_requrest中(或者加个中间件)更新此字段?

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

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

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

想听听大家的建议...
5080 次点击
所在节点    Python
19 条回复
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
2013-12-09 15:11:35 +08:00
@passluo 谢谢推荐!
hustlzp
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
2013-12-09 16:10:48 +08:00
我好像理解错LZ的意思的了 =。=

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

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

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

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

比如 apache 的 access log和 cookie log

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

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

BTW,要啥Redis,没几个用户就担心啥数据库鸭梨,我相信能问这个问题的应用,用户量也就十万级了不得,并发2位数吧。
所以,先用最简单的方式实现,等你用户上去了,数据库已经调优不行了,再考虑引入复杂的方案。
hustlzp
2013-12-13 18:51:37 +08:00
@nightsailer 有道理...过度优化
hustlzp
2013-12-13 18:53:15 +08:00
@nightsailer 话说,终于冒泡了?看你的主页是第一次回复啊
joey1988
2014-01-27 19:02:46 +08:00
数据库里面保存一个时间。 用户登录后,取数据库里面的时间保存在session里面。 页面上使用的上次登录时间就用session里面的。 然后数据库里面更新现在的时间。 我之前就是用这个思路的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/92400

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX