2017-12-18 9 views
0

cherrypy를 웹 서버로 사용하고 있으며 페이지를 반환하기 전에 사용자의 로그인 상태를 확인하려고합니다. 이것은 기본 응용 프로그램 클래스 (site.py)의 메서드에서 작동하지만 웹 페이지 트리에서 (별도의 파일로) 한층 더 깊은 클래스의 메서드에서 같은 장식 된 함수를 호출하면 오류가 발생합니다.cherrpy 응용 프로그램 (사이트 트리)의 가져온 하위 클래스에서 데코레이터를 호출 할 수 없습니다.

validate_user()은 데코레이터로 사용되는 함수입니다. 그 중 하나는 페이지로 사용자를 전달하거나처럼 cherrypy.Tool로, 401 제한된 페이지로 전송 :

from user import validate_user 
cherrypy.tools.validate_user = cherrypy.Tool('before_handler', validate_user) 

나는의 할당 인스턴스가 주요 site.py 파일의 응용 프로그램 클래스에 사이트의 다른 섹션을 첨부 따라서 변수로 서브 클래스 : I는 관리자 또는 API 또는 분석 섹션 내부 validate_user()를 사용하려고하면

from user import UserAuthentication 

class Root: 
    user = UserAuthentication() # maps user/login, user/register, user/logout, etc 
    admin = Admin() 
    api = Api() 

    @cherrypy.expose 
    @cherrypy.tools.validate_user() 
    def how_to(self, **kw): 
     from other_stuff import how_to_page 
     return how_to_page(kw) 

이를하지만, 작동하지 않습니다. 이들은 별도의 파일에 있습니다.

import cherrypy 

class Analyze: 
    @cherrypy.expose 
    @cherrypy.tools.validate_user() #### THIS LINE GIVES ERROR #### 
    def explore(self, *args, **kw): # @addkw(fetch=['uid']) 
     import explore 
     kw['uid'] = cherrypy.session.get('uid',-1) 
     return explore.explorer(args, kw) 

오류는 cherrypy.tools에 validate_user 기능이나 메소드가 없다는 것입니다. 하지만 site.py에서 할당 한 다른 것들은 여기 cherrypy에 나타납니다. 전체 사이트 맵에 포함 된 별도의 파일에서이 도구를 사용할 수없는 이유는 무엇입니까?

validate_user() 함수는 cherrypy.request.cookie를보고 'session_token'값을 찾고 데이터베이스와 비교하여 ID가 ​​일치하면 전달합니다.

죄송합니다. Analyze() 및 Api() 및 User() 페이지가 하위 클래스, 중첩 클래스 또는 확장 메서드 또는 무엇인지 알 수 없습니다. 그래서 나는 이것을 정확한 제목으로 줄 수는 없다. 어떻게 든 부모 클래스를 전달해야합니까?

+0

본인의 이전 질문에 대한 답변입니다. https://stackoverflow.com/questions/47840006/passing-function-into-a-class-and-using-it-as-a-decorator- of-class-methods와이 예제 https : // stackoverflow에서 영감을 얻은 것입니다.com/questions/6552025/cherrypy-custom-tool-for-user-authentication –

+0

'cherrypy.tools.validate_user = cherrypy.Tool ('before_handler ', validate_user)'라는 과제는 어디에 있습니까? 두 번째 클래스가 실행될 때 가져온 모듈에 없다면 할당이 결코 발생하지 않으며 할당에 대한 액세스 권한이 있어도'validate_user' 데코레이터에 액세스 할 수 없습니다 완료되었습니다. 두 번째 파일에 추가 가져 오기를 추가하면 할당이 실행됩니다. 'cherypy.tools'에 쓰는 것보다는 데코레이터를 다른 곳에 보관해야한다는 표시 일 수도 있습니다. – Blckknght

+0

'cherrypy.tools.validate_user = cherrypy.Tool ('before_handler', validate_user) '는 서버가로드 될 때로드되는 최상위 레벨 파일 인 site.py에서 발생합니다 (루트 클래스를 호출하기 전에 인스턴스화 됨) –

답변

1

여기서 문제는 가져 오는 동안 Python이 함수/메서드 본문을 제외한 모든 것을 처리한다는 것입니다. 당신 import user (또는 from user import <anything>은)는 user 모듈의 모든 원인 site.py에서 그래서는 파이썬 인터프리터에 의해 해당 도구에 액세스를 시도하는 장식, 포함 validate_user 도구의 정의를 얻었다 전에 를 처리 할 값 (참조가 아닌).

CherryPy에는 config를 사용하여 기능을 꾸미기위한 또 다른 메커니즘이 있습니다.이 메커니즘을 사용하면 해당 핸들러에서 도구를 사용할 수 있습니다. 대신 @cherrypy.tools.validate_user의 사용 :

이 장식 때문에 대신 핸들러 자체를 설치하는 cherrypy.tools에서 validate_user에 액세스 할 필요가 작품
@cherrypy.config(**{"tools.validate_user.on": True}) 

, 그것은 대신 핸들러가 호출 될 때, 나중에 핸들러에 해당 도구를 설치하는 CherryPy 구성 .

해당 도구가 해당 클래스의 모든 메소드에 필요하면 해당 클래스에 해당 구성 데코레이터를 사용할 수 있습니다.

다른 질문에서 언급 한 것처럼 서버 구성의 주어진 끝점에 대해이 도구를 활성화 할 수도 있습니다.

+0

위대한 - 이걸로 클래스 자체를 꾸미고 모든 URL이 인증을 요구하는 클래스를 만들려고합니다. –

관련 문제