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() 페이지가 하위 클래스, 중첩 클래스 또는 확장 메서드 또는 무엇인지 알 수 없습니다. 그래서 나는 이것을 정확한 제목으로 줄 수는 없다. 어떻게 든 부모 클래스를 전달해야합니까?
본인의 이전 질문에 대한 답변입니다. 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 –
'cherrypy.tools.validate_user = cherrypy.Tool ('before_handler ', validate_user)'라는 과제는 어디에 있습니까? 두 번째 클래스가 실행될 때 가져온 모듈에 없다면 할당이 결코 발생하지 않으며 할당에 대한 액세스 권한이 있어도'validate_user' 데코레이터에 액세스 할 수 없습니다 완료되었습니다. 두 번째 파일에 추가 가져 오기를 추가하면 할당이 실행됩니다. 'cherypy.tools'에 쓰는 것보다는 데코레이터를 다른 곳에 보관해야한다는 표시 일 수도 있습니다. – Blckknght
'cherrypy.tools.validate_user = cherrypy.Tool ('before_handler', validate_user) '는 서버가로드 될 때로드되는 최상위 레벨 파일 인 site.py에서 발생합니다 (루트 클래스를 호출하기 전에 인스턴스화 됨) –