flask_restful.reqparse ha quedado obsoleto ( https://flask-restful.readthedocs.io/en/latest/reqparse.html ):
Toda la parte del analizador de solicitudes de Flask-RESTful está programada para ser eliminada y será reemplazada por documentación sobre cómo integrarse con otros paquetes que hacen mejor las cosas de entrada/salida (como malvavisco ). Esto significa que se mantendrá hasta la 2.0 pero se considerará en desuso. No se preocupe, si tiene un código que lo usa ahora y desea continuar haciéndolo, no desaparecerá demasiado pronto.
Miré brevemente a Marshmallow y todavía estoy un poco confundido acerca de cómo usarlo si quisiera reemplazar reqparse.RequestParser() . ¿Qué escribiríamos en lugar de algo como lo siguiente:
from flask import Flask, request, Response from flask_restful import reqparse @app.route('/', methods=['GET']) def my_api() -> Response: parser = reqparse.RequestParser() parser.add_argument('username', type=str, required=True) args = parser.parse_args() return {'message': 'cool'}, 200(después de media hora de leer más documentación...)
RequestParser examina los valores de request.values de MultiDict de forma predeterminada (aparentemente consulta los parámetros y luego forma los parámetros del cuerpo de acuerdo con https://stackoverflow.com/a/16664376/5139284 ). Entonces solo necesitamos validar los datos en request.values de alguna manera.
Aquí hay un fragmento de código relevante de Marshmallow. Parece mucho más complicado que reqparse : primero crea una clase de esquema, luego crea una instancia y luego hace que cargue la solicitud JSON. Preferiría no tener que escribir una clase separada para cada punto final de la API. ¿Hay algo más ligero similar a reqparse , donde puede escribir todos los tipos de información de validación de argumentos dentro de la función que define su punto final?
from flask import Flask, request, Response from flask_restful import reqparse from marshmallow import ( Schema, fields, validate, pre_load, post_dump, post_load, ValidationError, ) class UserSchema(Schema): id = fields.Int(dump_only=True) email = fields.Str( required=True, validate=validate.Email(error="Not a valid email address") ) password = fields.Str( required=True, validate=[validate.Length(min=6, max=36)], load_only=True ) joined_on = fields.DateTime(dump_only=True) user_schema = UserSchema() @app.route("/register", methods=["POST"]) def register(): json_input = request.get_json() try: data = user_schema.load(json_input) except ValidationError as err: return {"errors": err.messages}, 422 # etc.Si sus puntos finales comparten algo en común en el esquema, puede usar fields.Nested() para anidar definiciones dentro de cada clase de Marshmallow, lo que puede ahorrar en la escritura de código para cada punto final. Los documentos están aquí.
Por ejemplo, para las operaciones que actualizan un recurso llamado 'Usuario', es probable que necesite un subconjunto estandarizado de información de usuario para realizar la operación, como user_id, user_login_status, user_authorisation_level, etc. Estos pueden crearse una vez y anidarse en nuevas clases para obtener más operaciones de usuario específicas, por ejemplo, actualizar la cuenta de un usuario:
class UserData(Schema): user_id = fields.Int(required=True) user_login_status = fields.Boolean(required=True) user_authentication_level = fields.Int(required=True) # etc .... class UserAccountUpdate(Schema): created_date = fields.DateTime(required=True) user_data = fields.Nested(UserData) # account update fields...