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 런타임과 마찬가지로 정상적으로 작동하므로 필자는 현재 깨지지 않은 것을 "고치는"중요한 일을하십시오.)
cardbrowser_crypt.crypt_browser는 무엇을 반환합니까? webapp은 처리기의 반환 값을 가진 어떤 것도 수행하지 않았지만 webapp2를 사용하면 Response를 반환 할 수 있습니다 (반환 값이 Response이기를 기대합니다). 이것을 확인해야합니다 : https://webapp-improved.appspot.com/guide/routing.html#lazy-handlers – Greg
webapp.RequestHandler에서 파생 된 cardbrowser_crypt.crypt_browser 클래스의 인스턴스를 반환합니다. –
게으른 핸들러를 사용하는 것이 내 문제에 대한 빠르고 쉬운 해결책 인 것 같습니다. –