【发布时间】:2014-09-01 04:15:49
【问题描述】:
任何人都知道为什么我遇到了一个明显的问题,即 webapp2 不能完全向后兼容 Google App Engine 现已弃用的 webapp 框架?当我使用函数而不是 RequestHandler 类对象作为请求处理程序时,我收到 TypeError 异常,因为某些对象不可调用。
下面是显示问题的代码摘录:
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 对象是从webapp.RequestHandler 派生的类对象,仅定义了 get() 方法。 import cardbrowser_crypt 语句很昂贵,因此这就是通过函数进行间接寻址的原因。使用/search_crypt2 URL 可以正常工作,而/search_crypt URL 会产生异常:
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
没有明显的理由为什么用函数代替类对象会产生这个异常。 webapp2 文档说可以使用可调用对象。文档指出 webapp2 与 webapp 完全向后兼容,并且使用此处的功能可与原始 webapp 一起使用。
(可以说我的应用程序设计得很糟糕,可以通过某种方式进行重构以避免这个问题。但是,由于该应用程序很少使用并且可以在旧的 Python 2.5 运行时正常工作,所以我不愿意这样做任何“修复”当前未损坏的东西的重要工作。)
【问题讨论】:
-
cardbrowser_crypt.crypt_browser 返回什么?我不认为 webapp 对处理程序的返回值做了任何事情,但是 webapp2 允许您返回一个响应(因此期望返回的值是一个响应)。不过,您应该检查一下:webapp-improved.appspot.com/guide/routing.html#lazy-handlers
-
它返回一个cardbrowser_crypt.crypt_browser类的实例,它派生自webapp.RequestHandler。
-
使用惰性处理程序似乎是解决我的问题的快速简便的方法。
标签: python google-app-engine webapp2