2014-07-10 2 views
0

Google App Engine의 현재 감가 상각 된 webapp 프레임 워크와 완벽하게 하위 호환되지 않는 webapp2의 명백한 문제가 발생한 이유를 아는 사람이 있습니까? RequestHandler 클래스 객체 대신 요청 핸들러로 함수를 사용할 때 일부 객체를 호출 할 수 없기 때문에 TypeError 예외가 발생합니다.webapp2 요청 처리기와의 역 호환성 문제

찾는 문제를 나타내는 코드 발췌 같습니다

import wsgiref.handlers 
import google.appengine.ext.webapp as webapp 

def crypt_browser(request = None, response = None): 
    import cardbrowser_crypt 
    return cardbrowser_crypt.crypt_browser(request, response) 

import cardbrowser_crypt 
urlmap = [("/search_crypt", crypt_browser), 
      ("/search_crypt2", cardbrowser_crypt.crypt_browser), 
] 

application = webapp.WSGIApplication(urlmap, debug = True) 

def main(): 
    wsgiref.handlers.CGIHandler().run(application) 

cardbrowser_crypt.crypt_browser 개체 정의 만 GET() 메소드 webapp.RequestHandler에서 파생 된 클래스 오브젝트이다. import cardbrowser_crypt 문은 비용이 많이 들기 때문에 함수를 통한 간접 참조의 이유입니다. 이 예외를 생성해야하는 클래스 개체의 기능을 대체 왜

Traceback (most recent call last): 
    File "e:\util\python27\lib\wsgiref\handlers.py", line 85, in run 
    self.result = application(self.environ, self.start_response) 
    File "e:\util\google_appengine\lib\webapp2-2.3\webapp2.py", line 1524, in __call__ 
    return self._internal_error(e)(environ, start_response) 
    File "e:\util\google_appengine\lib\webapp2-2.3\webapp2.py", line 1522, in __call__ 
    return response(environ, start_response) 
TypeError: 'crypt_browser' object is not callable 

명백한 이유가 없습니다 다음 /search_crypt URL이 예외를 생성하는 동안 /search_crypt2 URL을 사용하여, 잘 작동합니다. webapp2 문서에는 호출 가능 객체를 사용할 수 있다고 나와 있습니다. 설명서에 따르면 webapp2는 webapp와 완벽하게 호환되며 여기에있는 함수를 사용하면 원래 webapp에서 찾을 수 있습니다.

(아마도 내 응용 프로그램이 잘못 설계되어이 문제를 방지하기 위해 리팩터링 될 수 있습니다. 그러나 응용 프로그램이 거의 사용되지 않고 이전 Python 2.5 런타임과 마찬가지로 정상적으로 작동하므로 필자는 현재 깨지지 않은 것을 "고치는"중요한 일을하십시오.)

+0

cardbrowser_crypt.crypt_browser는 무엇을 반환합니까? webapp은 처리기의 반환 값을 가진 어떤 것도 수행하지 않았지만 webapp2를 사용하면 Response를 반환 할 수 있습니다 (반환 값이 Response이기를 기대합니다). 이것을 확인해야합니다 : https://webapp-improved.appspot.com/guide/routing.html#lazy-handlers – Greg

+0

webapp.RequestHandler에서 파생 된 cardbrowser_crypt.crypt_browser 클래스의 인스턴스를 반환합니다. –

+0

게으른 핸들러를 사용하는 것이 내 문제에 대한 빠르고 쉬운 해결책 인 것 같습니다. –

답변

-1

그렉의 반응은 문제를 추적하는 데 필요한 단서를주었습니다. 새로운 webapp2 모듈은 함수 또는 클래스인지 여부에 따라 요청 핸들러로 주어진 callable을 다르게 처리합니다. 이전 webapp 모듈은 이러한 호출 가능 항목을 동일하게 처리했습니다. 내 함수는 요청을 처리하는 데 사용되는 webapp에 의해 RequestHandler의 인스턴스를 반환 할 것으로 예상되었지만 webapp2는 함수가 실제로 요청을 처리 할 것으로 기대합니다.

내 코드가 webapp2와 호환되지 않는다는 것을 의미하지만, Greg가 sugggested하는 지연 평가 기능을 사용하면 내 App을 새로운 App Engine 환경으로 이식 할 수있는 간단한 방법입니다. 고마워, 그렉.