python-запросы: POST работает, ошибка ВВОДА — «Учетные данные для аутентификации не были предоставлены».

#django #django-rest-framework #python-requests #authorization

#django #django-rest-framework #python-запросы #авторизация

Вопрос:

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

Пытаюсь устранить неполадки в 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 print в прямой запрос HTTPie, это сработает. Приведенный ниже запрос приводит к успешному ответу 200 и обновленной записи на сервере:

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

Если я жестко запрограммирую простой скрипт, который не делает ничего, кроме импорта python и json, и ПОМЕЩАЮ те же данные в тот же 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:

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

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

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