关于 before_first_request 的用法问题


#1

我的需求:

当用户登录的成功后,自动增加登录的次数
数据模型:

login_times = db.Column(db.Integer, default=0)

   # 记录用户的登录次数
    def add_login_times(self):
        self.login_times += 1
        db.session.add(self)
        db.session.commit()

我的实现方法:

@app.before_first_request
def auto_add_login_times():
    if current_user.is_authenticated:
        current_user.add_login_times()

好像这样不行,我应该怎么写呢?


#2

好像这样不行

说清楚是怎么不行啊:joy:


#3

就是无法自动增加登录的次数啊!
后面我干脆在登录视图函数里面加算了,虽然这样很丑陋!


#4

我认为增加登录次数功能正常情况下就是在登录视图函数里写的。

因为@app.before_first_request这个钩子函数是针对app实例第一次请求过来而触发的钩子函数,因为只触发一次所以可以放一些数据库初始化的代码。不过项目中我很少用到。


#5

如果是放在@app.before_request里,则是统计已登录用户请求次数


#6

我查了下,有一种使用 flask-login logged_user 的方法,但是看不太懂
好像可以自定义很多关于用户的统计信息


#7

那个也可以,用了flask-login扩展。


#8

不过刷新最后用户的登录时间,我还是用的 before_request !但是这样的化会不会每发一次请求就会刷新登录时间?

如果换成这样会不会好点:

记录用户的最后在线时间在 logout_user() 视图里面写,下线的时间=最后在线时间 ?


#9

用户最后在线时间最好还是理解为用户最后一次请求时间,毕竟大多数人都习惯不点击登出,而且用户端是很容易出现非正常关闭(非正常登出)的。

登出一般用来删掉客户端的Cookie(尤其是Remember Me Cookie)。


#10

最后一次请求怎么知道啊?
好像没有这种功能的 钩子啊

after_reqeuest ?
after_this_request?
teardown_request?


#11

好像明白了,我仔细看了书上讲各种钩子的那一部分!

before_reqeust 的例子就是记录用户最后在线时间

好像我就是这么写的,看来没有问题!

def last_login_time(self):
      self.last_login_time = datetime.utcnow()

@app.before_request
def user_last_seen():
    if current_user.is_authenticated:
        current_user.last_login_time()

#12

那些钩子函数都是请求生命周期的钩子函数。并不能直接用在你说的用户登录的业务逻辑上,所以这里思维需要转换一下。

用户端收到响应后,请求生命周期(钩子函数)已经完整走一遍了。并不是说Flask会提供一个还没有触发的「用户登出钩子函数」。


#13

非常感谢啊,这部分听了你的解释和自己实际操作了之后,现在是算明白过来了!