Django在登录时发出信号

Pay*_*aam 3 django session signals login

用于登录功能的django信号是什么?用户已添加到请求会话表中.那么在Django auth.login函数中对signal的最后一行调用是什么?

 @sensitive_post_parameters() 
 @csrf_protect
 @never_cache
 def login(request, user):
  """
  Persist a user id and a backend in the request. This way a user doesn't
  have to reauthenticate on every request. Note that data set during
  the anonymous session is retained when the user logs in.
  """
  session_auth_hash = ''
  if user is None:
     user = request.user
  if hasattr(user, 'get_session_auth_hash'):
     session_auth_hash = user.get_session_auth_hash()

  if SESSION_KEY in request.session:
    if _get_user_session_key(request) != user.pk or (
            session_auth_hash and
            request.session.get(HASH_SESSION_KEY) != session_auth_hash):
        # To avoid reusing another user's session, create a new, empty
        # session if the existing session corresponds to a different
        # authenticated user.
        request.session.flush()
  else:
    request.session.cycle_key()
  request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
  request.session[BACKEND_SESSION_KEY] = user.backend
  request.session[HASH_SESSION_KEY] = session_auth_hash
  if hasattr(request, 'user'):
    request.user = user
  rotate_token(request)
  user_logged_in.send(sender=user.__class__, request=request, user=user)
Run Code Online (Sandbox Code Playgroud)

Rah*_*pta 8

已经定义user_logged_in了在结束时发送的信号,login()以便在用户登录时可以用于通知.它还更新last_login当前登录用户的属性(如上面提到的@ozgur).

登录和注销信号文档:

auth框架使用两个信号(user_logged_inuser_logged_out),可在用户登录或注销时用于通知.

使用此信号发送的参数是:

  1. sender :刚刚登录的用户的类.
  2. request :当前的HttpRequest实例.
  3. user :刚刚登录的用户实例.

使用此功能有助于在用户登录时允许解耦应用程序得到通知.

假设您希望在用户登录并执行某些操作时收到通知,然后您可以使用此信号以便您的接收者在用户登录时收到通知.要接收信号,您需要注册一个接收器函数,该函数在使用该Signal.connect()方法发送信号时被调用.

例如:

perform_some_action_on_login 是一个接收器功能,它将在用户登录时执行一些额外的操作.

from django.contrib.auth.signals import user_logged_in

def perform_some_action_on_login(sender, user, **kwargs):
    """
    A signal receiver which performs some actions for
    the user logging in.
    """
    ...
    # your code here
Run Code Online (Sandbox Code Playgroud)

定义寄存器功能后,将此接收器功能与user_logged_in信号连接

user_logged_in.connect(perform_some_action_on_login)
Run Code Online (Sandbox Code Playgroud)

现在,无论何时用户登录,user_logged_in都会发送由接收器功能接收的信号perform_some_actions_on_login.然后它执行那些额外的操作.