【问题标题】:Backwards-incompatibility with webapp2 request handler与 webapp2 请求处理程序的向后不兼容
【发布时间】: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


【解决方案1】:

Greg 的回复为我提供了追查问题所需的线索。新的 webapp2 模块对作为请求处理程序的可调用对象进行不同的处理,具体取决于它们是函数还是类。旧的 webapp 模块对这些可调用对象的处理方式相同。我的函数应该由 webapp 返回一个 RequestHandler 的实例,然后该实例将用于处理请求,但 webapp2 期望该函数实际处理请求。

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

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多