1. ホーム
  2. python

[解決済み] Django: ユーザーがログインしたらシグナルを送る?

2023-06-05 05:28:24

質問

私の Django アプリでは、ユーザがログインしたときにいくつかの定期的なバックグラウンドジョブの実行を開始し、ユーザがログアウトしたときにそれらの実行を停止する必要があるので、エレガントな方法を探しています。

  1. ユーザーのログイン/ログアウトの通知を受ける
  2. ユーザのログイン状態を問い合わせる

私の見解では、理想的な解決策は

  1. によって送信される信号が django.contrib.auth.views.login... views.logout
  2. 方法 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モデルに属するものです。

誰か代替のアプローチを考えることができますか?

どのように解決するのですか?

次のようなシグナルを使うことができます(私は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)

django のドキュメントを参照してください。 https://docs.djangoproject.com/en/dev/ref/contrib/auth/#module-django.contrib.auth.signals そして、ここ http://docs.djangoproject.com/en/dev/topics/signals/