web-dev-qa-db-fra.com

Faire une requête POST en utilisant ab (benchmark Apache) sur un serveur Django

J'essaie de faire une requête HTTP POST en utilisant ab vers un formulaire construit avec Django.

J'utilise la ligne suivante:

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

Ma ab_file.data ressemble à ça:

url=my_encoded_url&csrfmiddlewaretoken=my_token

Il renvoie toujours un 403 code d'état.

Lorsque j'utilise curl en utilisant les mêmes paramètres, cela fonctionne. La ligne de curl:

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

Comment puis je faire ça?

14
hermancaldara

@ jacobm654321,

pour sûr, la meilleure chose à faire est de coder l'URL par programmation. Mais mon problème n'était pas ça. Mon problème est que le fichier contenant les données de publication avait une ligne vierge à la fin du fichier. EditorConfig l'a mis là. Après avoir supprimé cette ligne vierge, tout a bien fonctionné.

Merci quand même.

3
hermancaldara

Le fichier doit avoir des données correctement encodées en url. Si vous encodez l'URL manuellement, il est trop facile d'avoir des fautes de frappe comme des blancs mal encodés. Il vaut mieux le faire par programme. Voir une autre réponse: Apache Bench et POST data sur la façon d'utiliser Python pour créer un tel fichier (ex: post.data )

Utilisez ensuite: ab -T 'application/x-www-form-urlencoded' -n 10 -p post.data http://localhost:8080/

16
jacobm654321

Lorsque vous utilisez ab, tout le contenu du fichier de données doit être encapsulé sur une seule ligne - il échoue silencieusement s'il est normalement développé JSON. Ainsi, une publication à partir d'un fichier de données qui fonctionne correctement avec curl échouera avec ab jusqu'à ce que vous le fassiez.

Astuce: Si vous utilisez Atom ou VSCode, sélectionnez tout et appuyez sur Cmd-J pour tout mettre sur une seule ligne.

6
shacker