Python 장식 기 는 몇 가지 검증 기능 방법 인 스 턴 스 를 실현 합 니 다.

최근 에 새로운 수요 가 생 겨 서 시스템 에 몇 개의 자원 권한 을 추가 해 야 합 니 다.코드 의 변경 과 프로그램의 복잡 도 를 최대한 줄이다.그래서 장식 기 를 사용 하 는 게 과학적 이에 요.
이전에 로그 인 검증 을 위 한 기 존 장식 기 모듈 을 사 용 했 습 니 다.그리고 사용자 관리 부분의 권한 장식 기 를 모방 합 니 다.
예 를 들 면 아래 이런 거.

def permission_required(permission):
  def decorator(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
      if not current_user.can(permission):
        abort(403)
      return f(*args, **kwargs)
    return decorated_function
  return decorator

def admin_required(f):
  return permission_required(Permission.SMY)(f)
권한 을 호출 할 때 이해 하기 쉽다.직접 모방 adminrequired 형식 이면 됩 니 다.그리고 각 페이지 입구 마다 문법 사탕 으로 이렇게 쓰 세 요:@adminrequired
그래서 페이지 의 입구 권한 이 완성 되 었 습 니 다.그러나 자원 권한 과 페이지 권한 은 다르다.위 내용 에서 언급 한 permission 은 model.py 의 정적 내용 에 쓰 여 있 습 니 다.
포장 을 보면 적어도 사용자 조회 방법(초보 수준)이 어느 곳 에 노출 되 었 는 지 알 수 없다.간단하게 알 수 있 는 if 판단 에 current 를 사용 한 것 같 습 니 다.user 이 변수의 내장 방법
하지만 현재user 는 제3자 가방 의 내용 으로 로그 인 모듈 에 도 입 된 가방 과 마찬가지 로 token 정 보 를 기록 하 는 코드 입 니 다.상세 한 내용 이 너무 많다.여기 서 출발 해서 쓰 면 go die.
사실 호출 된.can(permission)이 model 류 에서 정의 하 는 클래스 방법 이라는 것 을 알 더 라 도.하지만 currentuser 는 어느 부분의 물건 을 찾 았 는 지 잘 모 르 겠 습 니 다.
그 러 니까 상관 없어.장식 기의 내용 을 처음부터 정리 하 다.
우선 간단 한 장식 기 작법 은 이해 하기 쉽다.예 를 들 어 원 함 수 는 이렇게 쓰 여 있다.

def page():
  if user == 'admin':
    form = Form()
    
    if request.method=='POST':
      
      db.session.add(form)
      db.session.commit()
      flash("success")
      return 0
이것 은 당연히 마음대로 쓴 함수(분명히 많은 문제 가 있 음)로 하나의 과정 을 표현 하 는 데 만 쓰 인 다.우선 루트 를 통 해 이 함 수 를 호출 할 때 첫 번 째 if 판단 을 먼저 실행 합 니 다.이 판단 은 바로 우리 가 원 하 는 검증 내용 이다.
검증 이 통 과 된 후에 사용자 가 이 페이지 를 방문 할 수 있다 는 것 을 설명 한 다음 에 페이지 내용 이 렌 더 링 되 고 상호작용 기능 도 허용 된다.
그럼 장식 기 는 바로 이 if 의 기능 을 추출 한 것 입 니 다.그러면 원 함 수 는 다음 과 같은 형식 으로 쓰 입 니 다.

@admin_check
def page():
    form = Form()

    if request.method=='POST':

      db.session.add(form)
      db.session.commit()
      flash("success")
      return 0
이 함수 만 으로 는 이렇게 쓰 는 것 이 좋 을 것 이 없습니다.원래 한 줄 의 코드 가 해결 한 문제 처럼 몇 줄 의 코드 를 더 사용 한 것 같 습 니 다.우 리 는 이 형식의 전체 코드 를 펼 쳐 보 자.

def admincheck(func):
  if user=='admin':
    return func
  
def page():
    form = Form()

    if request.method=='POST':

      db.session.add(form)
      db.session.commit()
      flash("success")
      return 0

page = admincheck(page())
위의 장식 기 는 페이지=admincheck 이라는 문장 을@모드 로 만 썼 다.
그러나 이런 표기 법 은 가장 기본 적 인 검증 문 제 를 해결 할 수 밖 에 없다.상대 적 으로 독립 된 입구 검증 이다.이 인증 은 프로그램 이 page()함수 에 전달 하 는 인 자 를 아직 받 지 못 했 습 니 다.즉,이 검증 은 이렇게 보면 쓸모 가 없다 는 것 이다.
하지만 메커니즘 은 이렇다.다음은 전달 되 는 요청 데 이 터 를 검증 하고 계속 수행 하 는 방법 을 연구 할 수 있다.

def admincheck(func):
  def inner(arg):
    if user == 'admin':
      if arg == 'false':
        abort(403)
    return func(arg)
  return inner
마찬가지 로 여러 개의 인자 가 있 을 때 def inner(arg)를 def inner(arg 1,arg 2)로 바 꾸 기만 하면 됩 니 다.
n 개의 매개 변 수 를 def inner(*args,**kwargs)라 고 쓸 때 주의해 야 합 니 다.*args 는 원 그룹,즉('user',1);**kwargs 는 사전,즉{'user':1}입 니 다.
이 두 개의 형 삼 을 동시에 쓰 면 기본적으로 전 달 된 모든 매개 변수 유형 을 처리 할 수 있다.
그럼요.그 밖 에 더 복잡 한 장식 기 쓰기 도 있다.그러나 전 달 된 인 자 를 처리 할 수 있 고 장식 함수 의 정상 적 인 집행 에 영향 을 주지 않 습 니 다.기본적으로 이전의 기능 을 실현 하 였 다.
그럼 고 개 를 돌려 예시 중의 서법 을 살 펴 보 자.최 외층 사용 def permissionrequired(permission):의 미 는 재 활용 을 실현 하려 는 것 이 분명 합 니 다.

def admin_required(f):
  return permission_required(Permission.SMY)(f)
위의(permission)형 삼 은 분명히 permission 에 대응 합 니 다.required(Permission.SMY)에서(Permission.SMY)이 인자 입 니 다.이 매개 변수의 형 삼 을 방법 체 내부 로 전달 하 다.
이것 도 장식 기 decorator(f)밖 에 함 수 를 한 층 더 끼 워 넣 는 이유 입 니 다.
그래서 그 전에 이 서법 의 내용 이 뚜렷 해 졌 다.

def permission_required(permission):

#             。           ,            ,          (    )
  def decorator(f):
  #               
    @wraps(f)
    #                         。      ,   __name__     
    def decorated_function(*args, **kwargs):
    #                 。                        
      if not current_user.can(permission):
      #       。current_user      (   ),  permission             permission          
        abort(403)
        #       ,  ,403        。      ,   redirect(url_for(logout))...
      return f(*args, **kwargs)
      #    ,         (   f()     (           ),  f         )
    return decorated_function
  return decorator

이 정도 면 거의 끝나 지 않 는 다.보충 하고 싶 은 사람 이 있 으 면 댓 글 을 남 겨 주세요.
이상 의 Python 장식 기 는 몇 가지 검증 기능 을 실현 하 는 실례 가 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기