2013-06-17 8 views
5

Ho un'app Flask che serve un'API a un utente Django. Io uso il requests library nel mio consumatore per colpire l'API.oggetti di richiesta Flask/Werkzeug formano il parametro

Il mio problema è questo: quando eseguo il test della mia API ottengo i dati POST in request.form e quando lo prendo dal mio utente (utilizzando la libreria delle richieste) ottengo i dati POST in request.data.

esempio

API endpoint in Flask app:

@mod.route('/customers/', methods=['POST']) 
def create_prospect(): 
    customer = Customer() 
    prospect = customer.create_prospect(request.form) 
    return jsonify(prospect.serialize()), 201 

test API endpoint in Flask app:

def test_creating_prospect(self): 
    with self.app.app_context(): 
     data = {'name': 'Test company and co'} 
     response = self.client.post(self.url, data=data) 
     ... 

Questo popola request.form nel mio endpoint, che funziona bene.

Consumare l'API dal mio Django app, utilizzando le richieste:

... 
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} 
data = {'name': 'Test company and co'} 
response = requests.post(url, data=data, headers=headers) 

Questo popola request.data nel mio punto finale, che non riesce come sto controllando request.form per le informazioni.

Ho avuto un pensiero mentre scrivevo questa domanda; Forse le intestazioni JSON stanno facendo populare request.data anziché request.form?

Qualsiasi input apprezzato.

Edit - Ho provato ad aggiungere le intestazioni per il mio test, ha funzionato bene:

headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} 
    response = self.client.post(self.url, data=data, headers=headers) 

risposta

6

Ah, mi è stato l'invio di una non corretta Content-Type. Cambiarlo in "application/x-www-form-urlencoded" fa sì che request.form ottenga le cose giuste.

request.data è popolato con roba Flask/Werkzeug non sa cosa fare con according to the docs.

Problemi correlati