2010-07-21 4 views
6

나는 cherrypy 응용 프로그램을 가지고 있으며 일부보기에서는 특정 사용자 만 볼 수 있도록 허용하고 다른 사용자는 승인 필요 페이지로 보내기를 원합니다.승인을위한 CherryPy 장식 자 작성

사용자 정의 데코레이터로이 작업을 수행 할 수있는 방법이 있습니까? 나는 그것이 가장 우아한 선택 일 것이라고 생각한다.

class MyApp: 
    @authorization_required 
    def view_page1(self,appID): 
     ... do some stuff ... 
     return html 

def authorization_required(func): 
    #what do I put here? 

는 또한 장식으로 불리는 authorization_required 기능 allow_group1, allow_group2 같은 매개 변수를 사용할 수 있습니다

여기에 내가 뭘 원하는지의 기본 예제가? 아니면 각 그룹마다 별도의 데코레이터가 필요합니까?

+0

모든 것이 가능하지만 어떤 종류의 인증 시스템을 사용하고 있습니까? 또는 사용 계획? CherryPy에는 몇 가지 인증 메소드 빌드가 있습니다. http://www.cherrypy.org/wiki/BuiltinTools – Wolph

+0

내장 된 것을 사용하고 싶지 않습니다. 체크 할 필요가있는 커스텀 데이터 스토어가 있습니다. – Greg

답변

4

좋아,이 경우 귀하의 장식은 다음과 같이 보일 것입니다 :

# without any parameters 
def authentication_required(f): 
    @functools.wraps(f) 
    def _authentication_required(*args, **kwargs): 
     # Do you login stuff here 
     return f(*args, **kwargs) 
    return _authentication_required 

# With parameters 
def authentication_required(*allowed_groups): 
    def _authentication_required(f): 
     @functools.wraps(f) 
     def __authentication_required(*args, **kwargs): 
      # Do you login stuff here 
      return f(*args, **kwargs) 
     return __authentication_required 
    return _authentication_required 
+2

@ functools.wraps는 무엇을합니까? 그것은 cherrypy에 내장되어 있습니까? – Greg

+0

또한 로그인 물건이 성공했을 때 f (* args, ** kwargs) 만 반환한다고 생각하십니까? 반면에 사용자가 승인되지 않은 경우 반환하는 대신 cherry.redirect를 호출합니까? – Greg

+0

예, 맞습니다. 그리고'functools.wraps'는 데코레이터 작성시 함수 이름, 문서 및 기타 데이터의 자동 복사를 처리하는 메소드입니다. 그렇게하면 데코 레이팅 된 메소드에서'help (method)'를하면 여전히 원본 문서를 얻을 수 있습니다. – Wolph

13

당신은 정말 CherryPy에 대한 사용자 정의 장식을 쓰고 싶지 않아. 대신 새로운 도구를 작성하려고합니다.

def myauth(allowed_groups=None, debug=False): 
    # Do your auth here... 
    authlib.auth(...) 
cherrypy.tools.myauth = cherrypy.Tool("on_start_resource", myauth) 

자세한 내용은 http://docs.cherrypy.org/en/latest/extend.html#tools을 참조하십시오. 이것은 사용자 정의 장식을 작성 비해 여러 가지 이점이 있습니다

  1. 당신은 도구에서 무료로 장식을 얻을 : @cherrypy.tools.myauth(allowed_groups=['me']),이를 이미 동일한 기능에 cherrypy.exposed 소지품하지 않는 방법을 알고 있습니다.
  2. 도구는 (장식자와 함께), 컨트롤러 트리마다 (_cp_config을 통해) 또는 URI 트리마다 (구성 파일 또는 사전에) 적용 할 수 있습니다. 그것들을 섞어서 장식자를 통해 기본 기능을 제공 한 다음 설정 파일에서 그 동작을 무시할 수도 있습니다.
  3. 설정 파일로 인해 기능이 꺼지게되면 데코레이터 기능을 호출했을 때 성능 저하가 발생하지 않습니다.
  4. 내장 된 모든 도구와 마찬가지로 '디버그'인수를 추가해야합니다. ;)
  5. 다른 "지점"을 선택하여 사용자 지정 데코레이터보다 기능을 더 빨리 (또는 필요한 경우 나중에) 실행할 수 있습니다.
  6. 필요한 경우 후크 포인트에서 기능을 실행할 수 있습니다.
+0

이 코드는 RoutesDispatcher (대신에?)를 사용하기 때문에 이것이 나를 위해 작동하는지 확실하지 않습니다. 데코레이터를 공개하십시오. 왜 그렇게되었는지 확신 할 수 없습니다. – Greg

+0

당신이 사용하는 디스패처는 실제로 문제가되지 않습니다 : 그 소금의 가치가있는 모든 디스패처 (경로 1 포함)는 도구에서 작동합니다. 노출 데코레이터는'method.exposed = True'를 설정하는 것 이상을 수행하지 않습니다. 다시 말하지만, 이는 모든 운영자에게 필요하며 도구가 작동하는지 여부와 관련이 없습니다. 말의 입에서 가져 가라. 도구는 CherryPy에서이 작업을 수행하는 방법입니다. – fumanchu

+0

제공된 코드 스 니펫은 어디서 제공됩니까? –