Выполните запрос POST, используя ab (апач-бенчмаркинг) на сервере django

Я пытаюсь выполнить запрос HTTP POST с помощью ab в форме, построенной с помощью django.

Я использую следующую строку:

ab -n 10 -C csrftoken=my_token -p ab_file.data -T application/x-www-form-urlencoded http://localhost:8000/

My ab_file.data выглядит следующим образом:

url=my_encoded_url&csrfmiddlewaretoken=my_token

Он всегда возвращает код состояния 403.

Когда я использую curl, используя те же параметры, он работает. Линия завитка:

curl -X POST -d "url=my_encoded_url&csrfmiddlewaretoken=my_token" --cookie "csrftoken=my_token" http://localhost:8000/

Как я могу это сделать?

Ответ 1

@jacobm654321,

наверняка, самое лучшее, что нужно сделать, это кодировать URL программно. Но моя проблема была не в этом. Моя проблема заключается в том, что файл, содержащий данные post, имел пустую строку в конце файла. EditorConfig положил его туда. После удаления этой пустой строки все сработало.

Спасибо в любом случае.

Ответ 2

Файл должен иметь правильные данные с кодировкой url. Если вы url-encode вручную, слишком легко иметь опечатки, как пробелы, неправильные кодировки. Лучше всего делать это программно. См. Другой ответ: Apache Bench and POST data о том, как использовать Python для создания такого файла (например: post.data)

Затем используйте:  ab -T 'application/x-www-form-urlencoded' -n 10 -p post.data http://localhost:8080/

Ответ 3

При использовании ab все содержимое файла данных должно быть заключено в одну строку - оно молча завершается неудачей, если обычно расширяет JSON. Так что сообщение из файла данных, который отлично работает с curl, не будет работать с ab, пока вы не сделаете это.

Совет: Если вы используете Atom или VSCode, выберите все и нажмите Cmd-J, чтобы перенести все в одну строку.