2012-04-25 12 views
21

Es necesario realizar una solicitud POST desde el servidor en el Frasco.¿Es posible hacer una solicitud POST en Flask?

Imaginemos que tenemos:

@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" }) 

no he encontrado nada específico en la documentación del frasco. Algunos dicen que urllib2.urlopen es el problema, pero no pude combinar Flask y urlopen. ¿Es realmente posible?

¡Gracias de antemano!

Respuesta

21

Sí, para realizar una solicitud POST puede utilizar urllib2, consulte el documentation.

Sin embargo, recomendaría utilizar el módulo requests.

EDITAR:

le sugiero que refactorizar el código para extraer la funcionalidad común:

@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 
+0

Hmmm, sí. Eso realmente implicaría hacer una solicitud de red, por una pequeña razón. Estoy seguro de que hay una mejor manera de hacer esto. – brice

+0

No me di cuenta de que quería hacer una "solicitud" a su propia aplicación, he actualizado mi respuesta. – codeape

+1

Refactorizar para extraer la funcionalidad es un buen consejo, y soluciona el problema al mismo tiempo que hace que el código sea más flexible +1 – brice

13

Para el registro, aquí está el código general de realizar una solicitud POST desde 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() 

Observe que estamos pasando un dict de Python utilizando la opción json=. Esto le indica convenientemente la biblioteca peticiones que hacer dos cosas:

  1. serializar el dict a JSON
  2. escribir el tipo MIME correcto ('application/json') en la cabecera HTTP

Y aquí hay una Aplicación de Frasco que recibirá y responderá a esa solicitud 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) 
+0

Me gustaría comentar la importancia de la parte 'json =' en la respuesta de @ Luke. Estuve luchando con esto por horas. Encontré la respuesta aquí. – user2326079

Cuestiones relacionadas