向后兼容webapp2请求处理程序

时间:2014-07-10 17:08:16

标签: python google-app-engine webapp2

任何人都知道为什么我遇到了一个明显的问题,即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网址可​​以正常工作,而/search_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

没有明显的理由为什么用一个函数替换一个类对象应该生成这个异常。 webapp2文档说可以使用可调用的。该文档指出webapp2完全向后兼容webapp,并且使用一个函数可以找到原始webapp。

(可以说我的应用程序设计糟糕,可以通过某种方式进行重构以避免此问题。但是,由于应用程序很少使用并且可以正常使用旧的Python 2.5运行时,我不情愿做任何重要的工作来修复"目前尚未破坏的东西。)

1 个答案:

答案 0 :(得分:-1)

格雷格的回答给了我解决问题所需的线索。新的webapp2模块根据它们是函数还是类来处理作为请求处理程序给出的可调用对象。旧的webapp模块对这些callables进行了相同的处理。我的函数应该通过webapp返回RequestHandler的实例,然后用于处理请求,但webapp2期望该函数实际处理请求。

因此,虽然这意味着我的代码与webapp2不兼容,但使用惰性评估功能Greg sugggested是一种将我的应用程序移植到新App Engine环境的简单方法。谢谢,格雷格。