django 함수 - login 상세 설명

2534 단어
먼저 이 login 함수의 코드를 살펴보겠습니다.
def login(request, user, backend=None):
    """
    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
                not constant_time_compare(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()

    try:
        backend = backend or user.backend
    except AttributeError:
        backends = _get_backends(return_tuples=True)
        if len(backends) == 1:
            _, backend = backends[0]
        else:
            raise ValueError(
                'You have multiple authentication backends configured and '
                'therefore must provide the `backend` argument or set the '
                '`backend` attribute on the user.'
            )

    request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
    request.session[BACKEND_SESSION_KEY] = 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)

일부분사용자 계정 정보 검사get_session_auth_hash () 사용자가 암호화한 정보를 얻는hash값입니다.sessionid, 이것을 가져와서 무슨 소용이 있겠습니까, 바로 다음에 클라이언트를 보내는HASHSESSION_KEY 대비, 대비 함수:constanttime_compare()라는 함수는 산열치의 길이만 비교할 뿐 속도는 받아들일 수 있다. 구체적인 대비와 소금을 넣는 과정은 원본 코드를 찍어서 보면 뚜렷하다.
2. 사용자 데이터를 검증한 후session 쓰기 동작을 하고 일련의session 값을 설정합니다.
3. 곧이어 토큰,rotate 업데이트token () 함수를 업데이트합니다.
4. 업데이트가 끝난 후에 하나의 신호 조작을 진행했다. 이곳의 신호 조작은 훅(갈고리)과 유사하다. 여기는 상세하게 설명하지 않고 다음 편은 훅의python 실현과 원리 분석을 쓴다.django에는 디스패치로 결합을 실현하고 일부 동작이 발생할 때 신호는 특정한 발송자가 수용자를 일깨워 주는 것을 허용한다.
모든 동작이 끝난 후에 로그인의 주요 기능을 완성했다. 이런 기능은 스스로 수동으로도 실현할 수 있지만 프레임워크가 비교적 완선하기 때문에 프레임워크 자체 기능을 사용하는 것을 추천한다.

좋은 웹페이지 즐겨찾기