Python запрашивает сообщение библиотеки, интерпретируемое Django как GET по некоторым причинам - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь сделать пост-запрос к API нашего приложения для некоторого регрессионного тестирования, но по какой-то причине, когда я делаю запрос таким же образом через запросы, он регистрируется и интерпретируется как запрос GET.

КОД:

requests.post({HTTP_PROTOCOL}://{APP_URL}/api/route/',
              headers={'Authorization': 'Bearer ' + access_token},
              json=DATA)

LOG:

[Thu Jul 11 19:17:30 2019] GET /api/route/ => generated 2 bytes in 64 msecs (HTTP/1.1 200) 5 headers in 162 bytes (1 switches on core 1)

Однако, когда я делаю запрос через Postman, запрос работает совершенно нормально и возвращается с созданным объектом в JSON, а в журналах он записывается как POST.

Бэкэнд в настоящее время написан на Django, используя Django Rest Framework для REST API. Вот маршрут в нашем urls.py файле:

url(r"^api/route/$", DataListView.as_view())

И я знаю, что DataListView работает, потому что Почтальон прекрасно с ним работает.

У меня были похожие проблемы, когда это не сработало, потому что я отправлял на маршрут без косой черты, а здесь это не так. Я знаю, что отправляю на маршрут с косой чертой, как вы можете убедиться сами.

ВОПРОС: Как мне заставить это работать? И почему он работает в Postman, но не использует библиотеку requests?

РЕДАКТИРОВАТЬ 1: Вот заголовки в запросе, если это дает какие-либо подсказки:

{
    'User-Agent': 'python-requests/2.22.0',
    'Accept-Encoding': 'gzip, deflate',
    'Accept': '*/*',
    'Connection': 'keep-alive',
    'Authorization': 'Bearer <access-token>'
}

РЕДАКТИРОВАТЬ 2: Я просто сделал это:

print(resp.request.method)

и распечатано GET ... Понятия не имею почему. Когда я сделал это на моем локальном сервере, он распечатал POST. Может ли это быть связано с тем, что я отправляю на https:// URL? Это странно.

Начиная с этого , похоже, что это вызывает перенаправление 301 или 302, которое вызывает это.

1 Ответ

1 голос
/ 11 июля 2019

Я закончил тем, что сделал то, что @IanStapletonCordasco предлагает для отладки в вопросе, с которым я связался и обнаружил, что мой HTTP_PROTOCOL был установлен на "http" вместо "https", что привело бы к перенаправлению прокси с nginx , который менял POST на GET. Я изменил это в моем конфигурационном файле, где установлена ​​эта переменная, и это сработало.

Что еще стоит отметить, для людей, у которых есть похожая проблема, посмотрите на URL, на который вы отправляете сообщение. Если в Django включена строгая проверка конечной косой черты (которая, я уверен, включена по умолчанию), и вы публикуете URL-адрес без конечной косой черты, он вернется с 30-кратным перенаправлением, которое вызовет похожая вещь случиться. Попробуйте добавить косую черту, и она должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...