Сломанный запрос PUT с помощью jquery / python GAE - PullRequest
3 голосов
/ 11 августа 2011

Я использую функцию jJuery 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: ahFkZXZ-YXp2ZC13ZWJub3Rlc3ItCxIKU3RpY2t5Tm90ZSIQdGVzdEBleGFtcGxlLmNvbQwLEgdzbk1vZGVsGAIM (from the POST call)
ID: (from the PUT call)

Так что очевидно, что он не проходит идентификатор правильнодля вызовов PUT, поэтому хранилище данных выдает мне ошибку BadKeyError.Я не уверен, является ли это проблемой на стороне jQuery, или это на стороне GAE, и я понятия не имею, что происходит.Любая помощь будет оценена.

1 Ответ

1 голос
/ 11 августа 2011

self.request.POST, и, следовательно, self.request.get() не возвращает данные формы для запросов PUT (или любых запросов не POST). Хотя отправка данных формы с помощью запроса PUT необычна (чаще вы отправляете что-то в качестве тела запроса), это, конечно, немного странно, что они намеренно отключают это здесь.

Если вы хотите получить доступ к данным, вам нужно будет самостоятельно декодировать их из тела, используя urlparse.parse_qs(self.request.body) или , как это .

Другой вариант - изменить API, чтобы вы не использовали данные формы, например, добавив идентификатор в URL-адрес, и отправив содержимое в виде необработанного тела запроса PUT.

...