代码之家  ›  专栏  ›  技术社区  ›  airportyh

如何在gae中重写http请求动词

  •  1
  • airportyh  · 技术社区  · 16 年前

    在google app engine webapp framework应用程序的上下文中:

    我想在案例a中更改请求的请求动词 提供参数方法,例如,如果传入post请求 对于参数_method=put,我需要更改请求以调用 处理程序的Put方法。这是为了处理prototype.js 与put和delete等动词一起使用(ie的解决方法)。这是我的 首次尝试:

    class MyRequestHandler(webapp.RequestHandler):
       def initialize(self, request, response):
           m = request.get('_method')
           if m:
               request.method = m.upper()
           webapp.RequestHandler.initialize(self, request, response)
    

    问题是,由于某种原因,每当重定向完成时, self.request.params在处理方法(put或 调用,即使它们是在初始化时填充的 打电话。有人知道这是为什么吗?作为权宜之计我想我 无法在initialize()时克隆参数,但.copy()不起作用, 我也没找到办法。

    更新:我收到了蛛形纲动物的非常有用的回复。我最终得到的解决方案使用了一个元类。它在下面。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Nick Johnson    16 年前

    无论如何,从initialize调用处理程序不是正确的方法-如果这样做,webapp也将调用原始处理程序。

    相反,你有两个选择:

    • 您可以将webapp.wsgiapplication子类化并重写 呼叫 根据存在的方法选择方法。
    • 您可以检查initialize中是否存在\u方法,如果存在,则相应地修改请求对象的“request\u method”环境变量。这将导致wsgiapplication类执行您选择的方法。

    不管怎样,看看google/appengine/ext/webapp/ 初始化 .py,这样你就可以看到它是如何工作的。

        2
  •  2
  •   airportyh    16 年前

    那是你的反应。向我指出框架的来源确实很有帮助。上一次我看到的源代码不在那里(只有.pyc),可能是随着sdk的新版本而改变的。对于我的情况,我认为重写wsgiapplication是正确的做法。然而,我选择了使用元类,因为它不需要我将一堆框架代码复制到我的代码中,然后修改它。这是我的解决方案:

    class RequestHandlerMetaclass(type):
        def __init__(cls, name, bases, dct):
            super(RequestHandlerMetaclass, cls).__init__(name, bases, dct)
            org_post = getattr(cls, 'post')
            def post(self, *params, **kws):
                verb = self.request.get('_method')
                if verb:
                    verb = verb.upper()
                    if verb ==  'DELETE':
                        self.delete(*params, **kws)
                    elif verb == 'PUT':
                        self.put(*params, **kws)
                else:
                    org_post(self, *params, **kws)
            setattr(cls, 'post', post)
    
    class MyRequestHandler(webapp.RequestHandler):
        __metaclass__ = RequestHandlerMetaclass