with tutorial restful make example develop python json rest flask flask-restful

python - restful - tutorial api rest flask



Cómo analizar el argumento POST a un servicio REST? (2)

Parece que tengo otro problema de JSON, esta vez cuando publico en el servicio REST. Estoy usando Flask-Restful .

api.add_resource(Records, ''/rest/records/<string:email>/<string:password>/<string:last_sync_date>'') parser = reqparse.RequestParser() parser.add_argument(''record_date'', type=str) parser.add_argument(''records'', type=str) parser.add_argument(''rating'', type=str) parser.add_argument(''notes'', type=str) class Records(Resource): def post(self, email, password, last_sync_date): args = parser.parse_args() records = args[''records''] # ''records'' = None, but why? return records, 201

Prueba de unidad:

resource_fields = { ''record_date'': fields.String, ''rating'': fields.Integer, ''notes'': fields.String, ''last_updated'': fields.DateTime, } records = {"records":[]} records["records"].append(marshal(record1, resource_fields)) rv = self.app.post(''/rest/records/{0}/{1}/{2}''.format(email, password, sync_date), data=json.dumps(records))

json.dumps (records) es:

str: {"records": [{"rating": 1, "notes": null, "last_updated": "Tue, 15 Oct 2013 15:52:44 -0000", "record_date": "2013-10-15 15:52:44.746815"}]}

¿Por qué args[''records''] None, donde claramente lo estoy enviando por el cable?

ACTUALIZAR:

Extraño es cuando envío un solo objeto, todo es elegante. Tan extraña:

record = dict(record_date=record1.record_date, rating=record1.rating, notes=record1.notes, last_updated=record1.last_updated) rv = self.app.post(''/rest/records/{0}/{1}/{2}''.format(email, password, sync_date), data=record)

args :

{''records'': None, ''notes'': None, ''task'': None, ''record_date'': ''2013-10-15 16:48:40.662744'', ''rating'': ''1''}


Terminé planteando esto como un problema en el frasco resit github y obtuve esta solución, que funciona para mí. El crédito va para Doug Black.

reqparse realmente no sabe cómo manejar JSON. Para tratar las publicaciones de JSON, querrá utilizar el dict de frasco.request.json.

Aquí hay un ejemplo actualizado de lo que probablemente quiera:

from flask import Flask, request from flask.ext import restful class Records(restful.Resource): def post(self, email, password, last_sync_date): records = request.json[''records''] return records, 201 app = Flask(__name__) api = restful.Api(app) api.add_resource( Records, ''/rest/records/<string:email>/<string:password>/<string:last_sync_date>'' )

Los documentos en request.json están aquí.

Deberá asegurarse de publicar con el encabezado de tipo de contenido establecido en application / json para que el matraz sepa que debe llenar el diccionario json.

self.app.post( ''/rest/records/{0}/{1}/{2}''.format(email, password, sync_date), data=json.dumps(records), headers={''Content-Type'': ''application/json'' )


class Records(Resource): parser = reqparse.RequestParser() parser.add_argument(''record_date'', type=str) parser.add_argument(''records'', type=str) parser.add_argument(''rating'', type=str) parser.add_argument(''notes'', type=str) def post(self): args = parser.parse_args() records = args[''records''] return records, 201

Espero que funcione.