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 장식 기 는 몇 가지 검증 기능 을 실현 하 는 실례 가 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.