플라스크-로그인 원리와 장식의 역할 @ login_manager.user_loader

장식하여 플라스크-로그인 @login_required 사용자가 로그인하지 않은 경우에 이동합니다 로그인 기능을 볼 수있는 권한이 있는지 여부를 확인하기 위해 login_manager.login_view를 = 'auth.login는' 로그인 페이지를 등록합니다. 즉, 우리의 등록 된 콜백 함수에 의해 내부적으로 호출에 로그인 할 때 login_user () 함수를 호출하는 것입니다.

형틀 로그인, 콜백 함수를 등록하는 세션에서 사용자가 지정한 함수 장식 판독 더 sessionID와, 존재하지 않는 경우, 현재 사용자 CURRENT_USER 전단 서식에 기록 호출의 목적을 달성하기 위해 장식 통해 상기 장식은 :

@ login_manager.user_loader

그 기능은 다음과 유사한

클래스 테스트 () :  
     # 시험에서이 콜백의 진정한 정의가없는 
    DEF : 피쳐 (셀프)   
        self.callback ()   
      
    DEF 장식 (자체, FUNC) :   
        self.callback = FUNC  
         반환 FUNC   

테스트 =   테스트 ()   

# 재미 레지스터됩니다 콜백 기능 
@ test.decorate  
 DEF 재미 () :  
     인쇄 (1 )   
  
#의 호출 기능은 콜백 함수 트리거       
test.feature ()   # 1

데코레이터 user_loader :

데프 user_loader (자기, 콜백) :
         '' ' 
        세션에서 사용자를 다시로드이 설정 콜백. 
        사용자가 설정 기능은 사용자의 ID (A``unicode``)를 취하고 반환해야합니다 
        사용자 개체를, 또는``None``는 사용자가 존재하지 않는 경우. 

        : PARAM 콜백 : 사용자 개체를 검색하는 콜백. 
        : 유형 콜백 : 호출 
        '' ' 
        self.user_callback = 콜백
         반환 콜백

데코레이터의 목적은 self.user_callback에 할당 된 콜백 함수에 관한 것입니다

login_user 내부 함수 :

USER_ID = getattr (사용자 current_app.login_manager.id_attribute) () 
세션 [ 'USER_ID'] = USER_ID #在这里设置用户아이디
세션 [ '_ 신선한'] 신선한 =
세션 [ '_ ID'] = current_app.login_manager._session_identifier_generator ()

: 기억한다면
세션 = '설정을'[ '기억']
기간은 아무도하지 않는 경우 :
시도 :
# 파이썬으로 timedelta.total_seconds ()하지만 작품에 2.6 동일
세션 [ 'remember_seconds를'] = (duration.microseconds +
(duration.seconds를 +
duration.days는 24 * 3600) * *
10 ** 6) / 10.0 ** 6
AttributeError 제외 :
인상 예외 ( '기간이하는 datetime.timedelta해야한다'
'대신 가지고 :. {0}'형식 (시간))

_request_ctx_stack.top.user = 사용자
user_logged_in.send (current_app._get_current_object (), 사용자 = _get_user ())

현재 요청 컨텍스트 세션 호에 속성과 바인딩의 사용. HTTP가 상태이기 때문에, 때마다 새 요청 플라스크 유통 경로의시, 요청 컨텍스트를 생성 시작은 플라스크-로그인 쿠키 판단을 현재 컨텍스트에 사용자 요청을 기반으로 구속으로 인해이의 존재에 관계 바인딩, 다음 때마다 새로운 요청은 지난 바인딩의 코드를 살펴 얻기 위해 사용자의 요구를 생성한다 :

DEF reload_user (자가 사용 = 없음) 
        CTX = _request_ctx_stack.top 

        경우 사용자 없음 : 
            USER_ID =에 Session.get ( ' USER_ID ' )
             경우 USER_ID가 없다 없음 : 
                ctx.user = self.anonymous_user ()
             밖의 :
                 만약 self.user_callback 입니다 : 없음
                     인상 예외 (
                         " 없음 user_loader이를 위해 설치되지 않은 " 
                        "LoginManager. 하나 추가 " 
                        " 'LoginManager.user_loader'장식합니다. " ) 
                사용자 = self.user_callback (USER_ID)
                 만약 사용자가 없는 것도 : 
                    ctx.user = self.anonymous_user ()
                 밖의 : 
                    ctx.user = 사용자
         다른 : 
            ctx.user = 유저
이 기능의 사용자가, 당신은 콜백 기능 self.user_callback를 호출해야합니다 때 호출되지 않습니다
 
콜백 함수의 그들의 정의 :
@ login_manager.user_loader
 데프 load_user (USER_ID) :
         반환 User.query.get (INT (USER_ID))

의미 self.user_callback이 reload_user의 역할이 사용자 값 없음 방법은 사용자의 요청을 얻을 때 호출하고 현재 컨텍스트에 바인딩 () 장식 콜백 함수 load_user를 장식, 바인딩 때마다 우리가 CURRENT_USER를 사용하는 것입니다 그것은 현재 컨텍스트에서 직접 반환됩니다.


 

실내 장식은 login_required :

데프 login_required (FUNC) : 
  
    @wraps (FUNC) 
    데프 decorated_view (* 인수, ** kwargs로) :
         경우 current_app.login_manager._login_disabled :
             리턴 FUNC (* 인수, ** kwargs로)
         ELIF  하지 current_user.is_authenticated :
             리턴 current_app.login_manager. 무단 ()
         반환 FUNC (* 인수, ** kwargs로)
     반환 decorated_view

추천

출처www.cnblogs.com/eat-w/p/12057189.html