web-dev-qa-db-fra.com

Est-il possible de faire une demande POST dans Flask?

Il est nécessaire de faire une demande POST côté serveur dans Flask.

Imaginons que nous ayons:

@app.route("/test", methods=["POST"])
def test():
    test = request.form["test"]
    return "TEST: %s" % test

@app.route("/index")
def index():
    # Is there something_like_this method in Flask to perform the POST request?
    return something_like_this("/test", { "test" : "My Test Data" })

Je n'ai rien trouvé de spécifique dans la documentation Flask. Certains disent urllib2.urlopen est le problème mais je n'ai pas réussi à combiner Flask et urlopen. Est-ce vraiment possible?

Merci d'avance!

27
VisioN

Oui, pour faire une demande POST vous pouvez utiliser urllib2, voir documentation .

Je recommanderais cependant d'utiliser le module requêtes à la place.

[~ # ~] éditez [~ # ~] :

Je vous suggère de refactoriser votre code pour extraire les fonctionnalités communes:

@app.route("/test", methods=["POST"])
def test():
    return _test(request.form["test"])

@app.route("/index")
def index():
    return _test("My Test Data")

def _test(argument):
    return "TEST: %s" % argument
27
codeape

Pour mémoire, voici le code général pour faire une demande POST de Python:

#make a POST request
import requests
dictToSend = {'question':'what is the answer?'}
res = requests.post('http://localhost:5000/tests/endpoint', json=dictToSend)
print 'response from server:',res.text
dictFromServer = res.json()

Notez que nous transmettons un dict Python dict en utilisant le json= option. Cela indique à la bibliothèque de requêtes de faire deux choses:

  1. sérialiser le dict en JSON
  2. écrire le bon type MIME ('application/json') dans l'en-tête HTTP

Et voici une application Flask qui recevra et répondra à cette demande POST:

#handle a POST request
from flask import Flask, render_template, request, url_for, jsonify
app = Flask(__name__)

@app.route('/tests/endpoint', methods=['POST'])
def my_test_endpoint():
    input_json = request.get_json(force=True) 
    # force=True, above, is necessary if another developer 
    # forgot to set the MIME type to 'application/json'
    print 'data from client:', input_json
    dictToReturn = {'answer':42}
    return jsonify(dictToReturn)

if __name__ == '__main__':
    app.run(debug=True)
31
Luke