Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 与webapp2请求处理程序向后不兼容_Python_Google App Engine_Webapp2 - Fatal编程技术网

Python 与webapp2请求处理程序向后不兼容

Python 与webapp2请求处理程序向后不兼容,python,google-app-engine,webapp2,Python,Google App Engine,Webapp2,有人知道为什么我会遇到一个明显的问题:webapp2不能完全向后兼容googleappengine现在已经贬值的webapp框架?当我使用函数而不是RequestHandler类对象作为请求处理程序时,我会得到一个TypeError异常,因为某些对象不可调用 下面是显示问题的代码摘录: import wsgiref.handlers import google.appengine.ext.webapp as webapp def crypt_browser(request = None, re

有人知道为什么我会遇到一个明显的问题:webapp2不能完全向后兼容googleappengine现在已经贬值的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\u crypt.crypt\u browser
对象是从
webapp.RequestHandler
派生的类对象,仅定义了get()方法。
import-cardbrowser\u-crypt
语句开销很大,因此这就是通过函数进行间接寻址的原因。使用
/search\u crypt2
URL可以正常工作,而
/search\u 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文档说明可以使用callable。该文档声明webapp2与webapp完全向后兼容,并且使用此处的函数可与原始webapp一起使用


(可以说,我的应用程序设计得很糟糕,可以通过某种方式进行重构来避免这个问题。但是,由于该应用程序很少使用,并且可以与旧的Python 2.5运行时配合使用,因此我不愿意做任何有意义的工作来“修复”当前未损坏的东西。)格雷格的回答给了我追踪问题所需的线索。新的webapp2模块根据调用对象是函数还是类,以不同的方式处理作为请求处理程序的调用对象。旧的webapp模块以相同的方式处理这些可调用项。webapp希望我的函数返回RequestHandler的实例,然后该实例将用于处理请求,但webapp2希望函数实际处理请求


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

什么是cardbrowser\u crypt.crypt\u浏览器?我不认为webapp对处理程序的返回值做了任何事情,但是webapp2允许您返回响应(因此期望返回的值是响应)。不过,您应该检查一下:它返回cardbrowser\u crypt.crypt\u browser类的一个实例,该类派生自webapp.RequestHandler。使用惰性处理程序似乎是解决我的问题的简单快捷的方法。