使用jquery / python GAE破坏了PUT请求

时间:2011-08-11 03:39:53

标签: jquery python http google-app-engine

我正在使用jQuery的AJAX功能,如下所示:

$.ajax ({ "url" : "/note",
         "async" : true,
         "type" : "POST",
         "data" : {"id" : id, "content" : el.value}
       });

在后端(Python Google App Engine,目前正在使用webapp.RequestHandler),PUT请求由处理POST请求的同一函数处理,如下所示:

class uNote(webapp.RequestHandler):
def post(self):
    user = users.get_current_user()
    if user:
        logging.critical("ID: " + self.request.get('id'))
        note = stickynote.db.get( self.request.get('id') )
        if note:
            content = self.request.get( 'content' )
            if content:
                note.content = content
            else:
                note.x = int(self.request.get('x'))
                note.y = int(self.request.get('y'))
                note.z = int(self.request.get('z'))
            note.put()
            self.response.out.write ( "true" );
        else:
            self.response.out.write ("no id found")

def put(self):
    user = users.get_current_user()
    if user:
        logging.critical("ID: " + self.request.get('id'))
        note = stickynote.db.get( self.request.get('id') )
        if note:
            content = self.request.get( 'content' )
            if content:
                note.content = content
            else:
                note.x = int(self.request.get('x'))
                note.y = int(self.request.get('y'))
                note.z = int(self.request.get('z'))
            note.put()
            self.response.out.write ( "true" );
        else:
            self.response.out.write ("no id found")

如果我发出POST请求,一切正常。如果我将其更改为PUT请求(通过更改AJAX调用的类型),则无效。如果我检查GAE的日志,我看到:

BadKeyError: Invalid string key .

这是我记录每次通话ID的结果:

ID: ahFkZXZ-YXp2ZC13ZWJub3Rlc3ItCxIKU3RpY2t5Tm90ZSIQdGVzdEBleGFtcGxlLmNvbQwLEgdzbk1vZGVsGAIM (from the POST call)
ID: (from the PUT call)

很明显,它没有为PUT调用正确传递ID,这就是数据存储区给我一个BadKeyError的原因。我不确定这是否是jQuery方面的问题,或者它是否来自GAE方面,但我不知道发生了什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

self.request.POST,因此self.request.get() don't return form data for PUT requests(或任何非POST请求)。虽然使用PUT请求提交表单数据并不常见(更常见的情况是,您提交的内容是请求的主体),但在这里故意禁用它确实有点奇怪。

如果您想要访问数据,则需要使用urlparse.parse_qs(self.request.body)like this自行解码数据。

另一种选择是修改您的API,以便您不使用表单数据 - 例如,将ID作为URL的一部分,并将内容作为PUT请求的原始主体发送。