#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 от успешного ввода никогда не печатался и не попадал на консоль. Если бы я это видел, было бы намного легче найти. Однако, поскольку основная проблема решена, я не могу тратить время на устранение неполадок.
Я должен был видеть оба ответа — успех и сбой в консоли — проблема в другой раз.