2011-02-04 2 views
1

나는 같은 것을 할 싶습니다python appengine에서 basehandler의 핸들러를 어떻게 호출합니까?

class Basehandler(webapp.RequestHandler): 

    def __init__(self): 
    if checkforspecialcase: #check something that always needs to be handled 
     return SpecialCaseHandler.get() 

class NormalHandler(Basehandler): 

    def get(self): 
    print 'hello world' 
    return 

class SpecialCaseHandler(Basehandler): 

    def get(self): 
    print 'hello special world' 
    return 

아이디어는 특정 사건이 충족되는 경우에 상관없이 처음이라 불리는 핸들러, 우리는 기본적으로 다른 처리기로 전환 없다는 것입니다.

저는 파이썬에 익숙하지 않아, 제가하려고하는 것이 가능한지 확실하지 않습니다. 또는 이것이 최선의 접근 방법인지 여부. 필자가 실제로 시도하고있는 것은 등록 프로세스를 시작했지만 완료하지 않은 사람이 프로필 작성 페이지를 보여줄 수 있는지 확인하는 것입니다. 그래서 "checkforspecialcase"는 세션을보고 불완전한 정보를 확인합니다.

답변

3

건조하게 유지하기 위해, Template Method pattern를 사용

class BaseHandler(webapp.RequestHandler): 
    def DoGet(self, *args): 
     ''' defined in derived classes, actual per-handler get() logic''' 
     pass 

    def get(self, *args): 
     # don't get caught in endless redirects! 
     if specialCase and not self.request.path.startswith('/special'): 
      self.redirect('/special') 
     else: 
      self.DoGet(*args) 

class NormalHandler(BaseHandler): 
    def DoGet(self, *args): 
     # normal stuff 

class SpecialHandler(BaseHandler): 
    def DoGet(self, *args): 
     # SPECIAL stuff 
3

WSGIApplication은 들어오는 요청을 URL을 기준으로 라우팅합니다. 예를 들어,

application = webapp.WSGIApplication(
       [('/special-case', SpecialCaseHandler)]) 

checkforspecialcase 패스, 당신은 self.redirect('/special-case')를 사용합니다.

+0

내가 시도한 첫 번째 시도이지만 아무 것도 시도하지 않았습니다. 위의 조건 뒤에 self.redirect ('/ special-case')를 입력하면 다음 오류가 발생합니다. "AttributeError : 'NormalHandler'객체에 'request'속성이 없습니다." get() 또는 post() 메서드 내에서 사용할 수 있지만 초기화 메서드에서는 사용할 수 없습니다. –

+0

네, 맞습니다. 'get' 메소드에서 조건문을 사용하지 않는 이유는 무엇입니까? 왜 우리는'__init__'을 필요로합니까? – dheerosaur

+0

이 조건을 모든 페이지에 적용하려면 basehandler 클래스에서 한 번 실행하는 것이 좋습니다. 그리고 basehandler를 확장하는 클래스의 get/post 메소드는 basehandler의 get/post 메소드를 덮어 쓴다고 생각합니다. 그래서 이것을 get/post 메쏘드에 넣으려면 get/post 메쏘드에 넣어야 할 필요가 있습니다. 그냥 말리려고. –

0

Basehandler는 특별한 경우를 검사하고 self.view()를 리디렉션하거나 호출하는 get()을 구현할 수 있으며 각 핸들러는 view() (또는 호출 할 내용)를 구현할 수 있습니다. get()보다.

내 각 핸들러에 대한 클래스를 작성, 또는 그렇게 눈에 띄게 상속을 사용으로 정말 아니에요, 그래서 나는이 같은 롤링 장식을 권하고 싶습니다 :

routes = [] 

def get (route): 
    def makeHandler (handle, *args, **kwargs): 
     class Handler (webapp.RequestHandler): 
      def get (self, *args, **kwargs): 
       shouldRedirectToCompleteProfile = # do your test 
       if shouldRedirectToCompleteProfile: 
        self.redirect('/special-case') 
       else: 
        handle(self, *args, **kwargs) 
     routes.append((route, Handler)) 
     return Handler 
    return makeHandler 

def post (route): 
    def makeHandler (handle, *args, **kwargs): 
     class Handler (webapp.RequestHandler): 
      def post (self, *args, **kwargs): 
       handle(self, *args, **kwargs) 
     routes.append((route, Handler)) 
     return Handler 
    return makeHandler 

@get('/') 
def home (ctx): 
    # <...> 

@get('/whatever/(.*)/(.*)') 
def whatever (ctx, whatever0, whatever1): 
    # <...> 

@post('/submit') 
def submit (ctx): 
    # <...> 

application = webapp.WSGIApplication(routes) 
+0

@bgporter의 유일한 문제는 100 번째 처리기를 코딩 할 때 실수로 DoGet() 대신 get()을 구현하면 성가신 버그가 발생한다는 것입니다. 리디렉션을 확인하거나 get() 재정의를 찾는 정적 분석 단위 테스트를 작성하는 100 가지 기능 테스트를 작성하여 안심할 수 있습니다. 또는 내가 제안하는 것처럼 데코레이터를 사용하는 경우, 그런 종류의 버그를 도입 할 수 없기 때문에 테스트가 필요하지 않습니다. – dfichter

관련 문제