1

在 Google App Engine Webapp 框架应用程序的上下文中:

我想在提供参数_method的情况下更改请求的请求动词,例如,如果POST请求带有参数_method=PUT,我需要更改请求以调用处理程序的put方法。这是为了应对prototype.js 处理PUT 和DELETE 等动词的方式(IE 的解决方法)。这是我的第一次尝试:

MyRequestHandler 类(webapp.RequestHandler):
   定义初始化(自我,请求,响应):
       m = request.get('_method')
       如果米:
           request.method = m.upper()
       webapp.RequestHandler.initialize(自我,请求,响应)

问题是,由于某种原因,每当重定向完成时,self.request.params 在调用处理方法(放置或删除)时被清空,即使它们在调用初始化时被填充。任何人都知道这是为什么?作为一种解决方法,我认为我可以在 initialize() 时间克隆参数,但是 .copy() 不起作用,我也没有找到一种方法来做到这一点。

更新:我收到了来自 Arachnid 的非常有用的回复。我最终得到的解决方案使用了元类。它在下面找到。

4

2 回答 2

3

无论如何,从初始化调用处理程序都不是正确的方法——如果你这样做,webapp 也会调用原始处理程序。

相反,您有几个选择:

  • 您可以继承 webapp.WSGIApplication 并覆盖调用以选择基于 _method 的方法(当它存在时)。
  • 您可以在initialize中检查_method是否存在,如果存在,则相应地修改请求对象的'REQUEST_METHOD'环境变量。这将导致 WSGIApplication 类执行您选择的方法。

无论哪种方式,请查看 SDK 中的 google/appengine/ext/webapp/ init .py,以便了解它是如何工作的。

于 2008-11-01T18:22:13.057 回答
2

那是你的回应的蛛形纲动物。向我指出框架的来源真的很有帮助。最后我查看了源不存在(只有 .pyc),也许它随着 SDK 的新版本而改变。对于我的情况,我认为重写 WSGIApplication 是正确的做法。但是,我选择使用元类,因为它不需要我将一堆框架代码导入(复制)到我的代码中然后修改它。这是我的解决方案:

类 RequestHandlerMetaclass(类型):
    def __init__(cls, name, bases, dct):
        超级(RequestHandlerMetaclass,cls).__init__(名称,基地,dct)
        org_post = getattr(cls, 'post')
        def post(self, *params, **kws):
            动词 = self.request.get('_method')
            如果动词:
                动词 = verb.upper()
                如果动词 == '删除':
                    self.delete(*params, **kws)
                elif 动词 == 'PUT':
                    self.put(*params, **kws)
            别的:
                org_post(self, *params, **kws)
        setattr(cls,“发布”,发布)

MyRequestHandler 类(webapp.RequestHandler):
    __metaclass__ = RequestHandlerMetaclass
于 2008-11-02T17:35:47.190 回答