2015-05-27 10 views
6

Sono molto nuovo a Flask (& Flask-Restful).Python Flask-POST riposante che non accetta argomenti JSON

Il mio problema: json argomenti per un POST è impostato su NONE (non funziona).

Sono in grado di accettare argomenti dallo form-data, utilizzando il plug-in POSTMAN per Chrome. Ma, quando passo a raw (& feed a json), non riesce a leggere il json & assegna uno NONE a tutti i miei argomenti.

Ho letto alcuni post di stackoverflow correlati a questo: link1, link2, link3 ... nessuno di questi mi ha aiutato.

Sto usando python-2.6, Flask-Restful-0.3.3, Flask-0.10.1, Chrome, POSTMAN su Oracle Linux 6.5.

codice Pythonapp.py:

from flask import Flask, jsonify 
from flask_restful import reqparse, abort, Api, Resource 

app = Flask(__name__) 
api = Api(app) 

parser = reqparse.RequestParser() 
parser.add_argument('username', type=str) 
parser.add_argument('password', type=str) 

class HelloWorld(Resource): 
    def post(self): 
     args = parser.parse_args() 
     un = str(args['username']) 
     pw = str(args['password']) 
     return jsonify(u=un, p=pw) 

api.add_resource(HelloWorld, '/testing') 

if __name__ == '__main__': 
    app.run(host='0.0.0.0', port=5444 ,debug=True) 

prove della utilizzando POSTMAN:

  • Utilizzando form-data: funziona perfettamente!
  • Utilizzando raw ->json: causa il problema

Cose cercato # 1:

Aggiungi json parametro per il mio metodo add_argument() in app.py

parser = reqparse.RequestParser() 
parser.add_argument('username', type=str, location='json') # added json 
parser.add_argument('password', type=str, location='json') # added json 

Input: { "username": "h ello", "password": "mondo"}

Output: { "p": "Nessuno", "u": "Nessuno"}

Cose provato # 2:

Change digitare per unicode in add_argument() metodo app.py

parser = reqparse.RequestParser() 
parser.add_argument('username', type=unicode, location='json') # change type to unicode 
parser.add_argument('password', type=unicode, location='json') # change type to unicode 

Input: { "nome utente": "ciao", "password": "mondo"}

Output: { "p": "Nessuno", "u": "Nessuno"}


PS: terrò aggiornare la mia domanda, ad ogni tentativo fallito. Per favore fatemi sapere se avete bisogno di ulteriori informazioni per rendere questa domanda più chiara.

+0

Mi sembra che manchi una chiamata a 'parser.parse_args()'. Dovresti avere 'args = parser.parse_args()' prima di poter accedere a 'args' – junnytony

+0

@junnytony - è un refuso dal mio lato, ho dimenticato di copiare quella linea. Modifica la domanda subito! – sudhishkr

+0

Provare 'unicode' invece di' str' per i tipi di argomenti – sirfz

risposta

8

In base alla documentazione relativa a Request.json e al nuovo Request.get_json, è necessario che il tipo MIME sulla richiesta POST sia impostato su application/json. Questo è l'unico modo in cui la beuta analizza automaticamente i dati JSON nella proprietà Request.json che (credo) sia ciò che Flask-Restful dipende dal recupero dei dati JSON.

NOTA: la funzione più recente get_json ha un'opzione per forzare l'analisi dei dati POST come JSON, indipendentemente dal tipo MIME

6

risposta di junnytony mi ha dato un suggerimento, e sono andato avanti con questo approccio. get_json sembra aver fatto il trucco.

from flask import Flask, jsonify, request 
from flask_restful import reqparse, abort, Api, Resource 

app = Flask(__name__) 
api = Api(app) 

#parser = reqparse.RequestParser() 
#parser.add_argument('username', type=unicode, location='json') 
#parser.add_argument('password', type=unicode, location='json') 

class HelloWorld(Resource): 
    def post(self): 
     json_data = request.get_json(force=True) 
     un = json_data['username'] 
     pw = json_data['password'] 
     #args = parser.parse_args() 
     #un = str(args['username']) 
     #pw = str(args['password']) 
     return jsonify(u=un, p=pw) 

api.add_resource(HelloWorld, '/testing') 

if __name__ == '__main__': 
    app.run(host='0.0.0.0', port=5444 ,debug=True) 
+0

Nice :). ma penso che il tuo codice sarebbe ancora più bello se tu modificassi il mimetype per il tuo post come 'application/json'. Suppongo che tu stia usando AJAX per il tuo post. Con qualcosa come jQuery puoi facilmente aggiungere il mimetype appropriato, ad esempio http://stackoverflow.com/questions/6323338/jquery-ajax-posting-json-to-webservice – junnytony

+0

Grazie per aver fornito il tuo codice finale, ho un caso d'uso simile . –

+0

HI, anche io sto affrontando lo stesso problema. Come per il tuo suggerimento l'ho fatto, ma continuo a ricevere l'errore di richiesta errata – KCN