2015-08-16 4 views
0

Я пытаюсь обновить документ в базе данных MongoDB, используя API-интерфейс MongoLab Rest http://docs.mongolab.com/data-api/.UrlFetch PUT отправляет почтовый запрос?

В документации говорится, что он использует запрос PUT для обновления документов внутри коллекции с помощью оператора обновления в теле HTTP-запроса.

Таким образом, в соответствии с документацией, я стараюсь следующее:

 urlinsert = 'https://api.mongolab.com/api/1/databases/ur_coursesniper/collections/classes?apiKey={key}&q={q}' 
     urlinsert = urlinsert.format(q=querycheck, key=CONFIG["key"]) 
     form_fields = { 
      "$push" : { "Users" : email}, 
     } 
     form_data = urllib.urlencode(form_fields) 
     result = urlfetch.fetch(url=urlinsert, 
      payload=form_data, 
      method=urlfetch.PUT,) 

Однако после этого блока кода выполняет документ в в коллекции не обновляется.

HTTP-ответ я получаю это

2015-08-16 10:55:45,129 module.py:812] default: "POST/HTTP/1.1" 200 91 

Это озадачивает, поскольку он говорит, что ответ является одновременно успешным и POST.

Любые идеи о том, что именно происходит?

ответ

1

str.format()возвращает отформатированную строку, она не обновляет ее на месте. Таким образом,

urlinsert.format(q=querycheck, key=CONFIG["key"]) 

не имеет никакого влияния на стоимость urlinsert, а строка запроса apiKey={key}&q={q} посылается. Попробуйте вместо этого:

urlinsert = urlinsert.format(q=querycheck, key=CONFIG["key"]) 

Было бы интересно посмотреть, что содержится в теле ответа от MongoDB - он может содержать сообщение об ошибке.


Update

Теперь, когда вы устанавливаете Content-Type: application/json заголовок, вам необходимо отправить данные JSON в полезной нагрузке. "$push" : { "Users" : email} недействителен JSON. Вы можете использовать json.dumps() преобразовать form_fields словарь в допустимую строку JSON:.

import json 

urlinsert = 'https://api.mongolab.com/api/1/databases/ur_coursesniper/collections/classes?apiKey={key}&q={q}' 
urlinsert = urlinsert.format(q=querycheck, key=CONFIG["key"]) 
form_fields = {"$push": {"Users": email}} 

result = urlfetch.fetch(url=urlinsert, 
    payload=json.dumps(form_fields), 
    method=urlfetch.PUT, 
    headers={'Content-Type': 'application/json'}) 
+0

просто исправил ... до сих пор отправляет запрос POST, и обновления признанного в БД :(Спасибо – JesterKynes

+0

Вы проверили тело ответ на сообщение об ошибке? – mhawke

+0

есть какой-то прогресс! Я получил сообщение об ошибке {«message»: «Нет набора Content-Type, ожидающего« application/json ».»}, поэтому я добавил поле \t \t \t headers = { 'Content-Type': 'application/json'})) к вызову urlfetch.fetch(). Я все еще получаю сообщение, и я понятия не имею, почему .... – JesterKynes

Смежные вопросы