2015-08-09 101 views
3

什麼是登錄函數中使用的django信號?該用戶已被添加到請求會話表中。那麼在Django的auth.login函數中,最後一行的信號是什麼?Django登錄信號

@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) 

回答

8

login()結束時發送的user_logged_in信號已被定義,以便它可以被用於通知時在用戶登錄。它還更新爲當前登錄的用戶的last_login屬性(如@ozgur提到以上)。

Login and Logout Signals documentation

中的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 

用戶登錄定義寄存器功能之後,該接收器功能與user_logged_in信號連接。

user_logged_in.connect(perform_some_action_on_login) 

現在每當用戶登錄,發送由接收器功能perform_some_actions_on_login接收的user_logged_in信號。然後它會執行這些額外的操作。