一尘不染

Django:用户登录时发出信号?

django

在我的Django应用中,我需要在用户登录时开始运行一些定期的后台作业,并在用户注销时停止运行它们,因此我正在寻找一种优雅的方式

  1. 收到用户登录/注销的通知
  2. 查询用户登录状态
    在我看来,理想的解决方案是

  3. 由每个发送的信号django.contrib.auth.views.login... views.logout

  4. 一种django.contrib.auth.models.User.is_logged_in()类似于… User.is_active()或… User.is_authenticated()
    Django 1.1.1没有该功能,我不愿意修补该源代码并添加它(无论如何都不确定如何做到)。

作为一个临时解决方案,我is_logged_in向UserProfile模型添加了一个布尔字段,该字段默认情况下已清除,该字段在用户首次点击登录页面(由定义LOGIN_REDIRECT_URL = '/')时设置,并在后续请求中被查询。我将其添加到UserProfile中,因此不必为此而派生和自定义内置User模型。

我不喜欢这种解决方案。如果用户明确单击注销按钮,则可以清除该标志,但是在大多数情况下,用户只是离开页面或关闭浏览器即可;在这些情况下,清除标志似乎对我来说不是直截了当的。除此以外(虽然这是数据模型的清晰性挑剔),但is_logged_in它不属于UserProfile,而是属于User模型。

谁能想到替代方法?


阅读 492

收藏
2020-03-29

共1个答案

一尘不染

您可以使用这样的信号(我将我的信号放在models.py中)

from django.contrib.auth.signals import user_logged_in

def do_stuff(sender, user, request, **kwargs):
whatever…

user_logged_in.connect(do_stuff)

2020-03-29