web-dev-qa-db-fra.com

Flask request.args vs request.form

Ma compréhension est que request.args in Flask contient les paramètres codés URL d'une demande GET tandis que request.form contient POST données. Ce que j'ai du mal à comprendre, c'est pourquoi lors de l'envoi d'une demande POST, en essayant d'accéder aux données avec request.form renvoie un 400 erreur mais quand j'essaye d'y accéder avec request.args Cela semble marcher correctement.

J'ai essayé d'envoyer la demande avec Postman et curl et les résultats sont identiques.

curl -X POST -d {"name":"Joe"} http://127.0.0.1:8080/testpoint --header "Content-Type:application/json"

Code:

@app.route('/testpoint', methods = ['POST'])
def testpoint():
    name = request.args.get('name', '')
    return jsonify(name = name)
27
apardes

Vous POSTEZ JSON, ni request.args Ni request.form Ne fonctionneront.

request.form Ne fonctionne que si vous POST data with the right content types ; les données du formulaire sont POSTÉES avec les encodages application/x-www-form-urlencoded ou multipart/form-data .

Lorsque vous utilisez application/json, Vous N'AFFICHEZ PLUS de données de formulaire. Utilisez request.get_json() pour accéder aux données JSON POST à la place:

@app.route('/testpoint', methods = ['POST'])
def testpoint():
    name = request.get_json().get('name', '')
    return jsonify(name = name)

Comme vous le dites, request.args Ne contient que des valeurs incluses dans la chaîne de requête, la partie facultative d'une URL après le point d'interrogation ?. Comme il fait partie de l'URL, il est indépendant du corps de la requête POST.

41
Martijn Pieters

Vos données json en curl sont incorrectes, donc Flask n'analyse pas les données pour former.

Envoyer des données comme ceci: '{"name":"Joe"}'

curl -X POST -d '{"name":"Joe"}' http://example.com:8080/testpoint --header "Content-Type:application/json"
3
iurisilvio