장식하여 플라스크-로그인 @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 = 유저
@ 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