Простой анализ запроса без reqparse.RequestParser () - PullRequest
1 голос
/ 16 апреля 2020

flask_restful.reqparse устарел (https://flask-restful.readthedocs.io/en/latest/reqparse.html):

Вся часть синтаксического анализатора запроса Flask -RESTful запланирована для удаления и будет заменена на документация о том, как интегрироваться с другими пакетами, которые делают ввод / вывод лучше (например, marshmallow ). Это означает, что он будет поддерживаться до 2.0, но считается устаревшим. Не беспокойтесь, если у вас есть код, использующий его сейчас, и wi sh для продолжения, он не исчезнет в ближайшее время go.

Я кратко посмотрел на Зефир и до сих пор немного озадачен тем, как его использовать, если я хочу заменить reqparse.RequestParser(). Что бы мы написали вместо чего-то вроде следующего:

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

(через полчаса чтения еще немного документации…)

RequestParser по умолчанию смотрит на MultiDict request.values (очевидно запросить параметры, затем сформировать параметры тела в соответствии с { ссылка }). Итак, нам просто нужно как-то проверить данные в request.values.

Вот фрагмент некоторого соответствующего кода из Marshmallow. Кажется, это намного сложнее, чем reqparse: сначала вы создаете класс схемы, затем создаете его экземпляр, а затем загружаете запрос JSON. Я бы предпочел не писать отдельный класс для каждой конечной точки API. Есть ли что-то более легкое, похожее на reqparse, где вы можете записать все типы информации проверки аргументов в функции, определяющей вашу конечную точку?

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.
...