Python-запросы: POST работает, PUT не работает - «Учетные данные для аутентификации не предоставлены». - PullRequest
1 голос
/ 22 апреля 2019

Повторное редактирование с дополнительными обновлениями:

Попытка устранить неполадки в python-запросах, чтобы увидеть, если что-то не так с запросом PUT, но не уверен, как действовать.

Ниже приведен фрагмент моего кода:

def API_request(url=None, headers=None, payload=None, update=False):
    r = None
    if update and headers and payload:
        print "put request to %s with %s of %s" % (url, headers, payload)
        r = requests.put(url, headers=headers, data=payload)
    if headers and payload and not update:
        print "post request to %s with %s of %s" % (url, headers, payload)
        r = requests.post(url, headers=headers, data=payload)

    print r.status_code
    print r.text

Когда вышеприведенный отправляет запрос POST для создания записи, он работает.Однако всякий раз, когда он отправляет запрос PUT, я получаю сообщение об ошибке 401: «Учетные данные аутентификации не были предоставлены».Это происходит в нескольких конечных точках.

401
{"detail":"Authentication credentials were not provided."}

Если я скопирую / вставлю соответствующий напечатанный вывод из вышеприведенной функции печати PUT в прямой запрос HTTPie, это сработает.Приведенный ниже запрос приводит к успешному ответу 200 и обновленной записи на сервере:

http --debug PUT [url] < [file containing payload]  Authorization:'Token [token]'

Если я жестко закодирую простой скрипт, который не делает ничего, кроме импорта python и json и PUT точно таких же данных в те же данныеURL, использующий те же заголовки (напечатан из оригинального утверждения), работает.Приведенный ниже сценарий приводит к успешному ответу 200 и обновленной записи на сервере:

import requests, json

url = "[my url"
headers = {'Content-Type': 'application/json', 'Authorization': 'Token [my token]'}
data = {[my data]}
payload = json.dumps(data)

r = requests.put(url, headers=headers, data=payload)

print r.status_code
print r.text

Я отправил информацию из обоих сценариев на https://requestbin.fullcontact.com/, и они выглядят идентичными.

БОЛЬШАЯ ПРОБЛЕМА:

После целого дня отладки я выяснил, что даже запросы, которые генерировали ошибку 401, успешно попадали на сервер и обновляли соответствующие записи.Проще говоря, это было бы невозможно без правильной и функциональной аутентификации.Учитывая это, почему я получаю ошибку 401 из запроса PUT?

Рад ответить на любые вопросы в комментариях.

1 Ответ

0 голосов
/ 23 апреля 2019

Выше была отправка последующего запроса GET (без заголовка, поэтому он не удался) после успешной отправки запроса PUT (который был успешным).Я поймал это, регистрируя все запросы, попавшие на сервер.

Я выяснил, почему отправлялся последующий запрос GET, и исправил это.Я до сих пор не понимаю, почему ответы r.code и r.text от успешного PUT никогда не печатали и не ударяли по консоли.Если бы я видел это, было бы намного легче найти.Однако, поскольку основная проблема решена, я не могу тратить время на устранение неполадок, связанных с этим.

Я должен был увидеть оба ответа - успех и сбой в консоли - проблему в другой раз.

...