记录用户的最后访问时间
让我们从更容易实现的 last_seen
字段开始。 我想要做的就是一旦某个用户向服务器发送请求,就将当前时间写入到这个字段。
为每个视图函数添加更新这个字段的逻辑,这么做非常的枯燥乏味。在视图函数处理请求之前执行一段简单的代码逻辑在 Web 应用中十分常见,因此 Flask 提供了一个内置功能来实现它。解决方案如下:
from datetime import datetime
@app.before_request
def before_request():
if current_user.is_authenticated:
current_user.last_seen = datetime.utcnow()
db.session.commit()
Flask 中的 @before_request
装饰器注册在视图函数之前执行的函数。这是非常有用的,因为现在我可以在一处地方编写代码,并让它在任何视图函数之前被执行。该代码简单地实现了检查 current_user
是否已经登录,并在已登录的情况下将 last_seen
字段设置为当前时间。我之前提到过,应用应该以一致的时间单位工作,标准做法是使用 UTC 时区,使用系统的本地时间不是一个好主意,因为如果那么的话,数据库中存储的时间取决于你的时区。最后一步是提交数据库会话,以便将上面所做的更改写入数据库。如果你想知道为什么在提交之前没有 db.session.add()
,考虑在引用 current_user
时,Flask-Login 将调用用户加载函数,该函数将运行一个数据库查询并将目标用户添加到数据库会话中。所以你可以在这个函数中再次添加用户,但是这不是必须的,因为它已经在那里了。
如果在进行此更改后查看你的个人主页,则会看到“Last seen on”行,并且时间非常接近当前时间。 如果你离开个人主页,然后返回,你会看到时间在不断更新。
事实上,我在存储时间和在个人主页显示时间的时候,使用的都是 UTC 时区。 除此之外,显示的时间格式也可能不是你所预期的,因为实际上它是 Python datetime 对象的内部表示。 现在,我不会操心这两个问题,因为我将在后面的章节中讨论在 Web 应用中处理日期和时间的主题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论