没有 reqparse.RequestParser() 的简单请求解析

mic*_*mic 5 python flask flask-restful

flask_restful.reqparse已被弃用(https://flask-restful.readthedocs.io/en/latest/reqparse.html):

Flask-RESTful 的整个请求解析器部分将被删除,并将被有关如何与其他更好地执行输入/输出内容的包(例如marshmallow)集成的文档所取代。这意味着它将一直保持到 2.0,但认为它已被弃用。别担心,如果您现在有使用它的代码并希望继续这样做,它不会很快消失。

我已经简要地看了棉花糖,如果我想替换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
Run Code Online (Sandbox Code Playgroud)

(在阅读了更多文档半小时后......)

RequestParserMultiDict request.values默认查看(显然是查询参数,然后根据/sf/answers/1166506351/形成正文参数)。那么我们只需要以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.
Run Code Online (Sandbox Code Playgroud)

ato*_*ale 3

如果您的端点在架构中共享任何共性,则可以使用 fields.Nested() 在每个 Marshmallow 类中嵌套定义,这可以节省为每个端点编写代码的时间。文档在这里。

例如,对于更新名为“用户”的资源的操作,您可能需要用户信息的标准化子集来执行操作,例如 user_id、user_login_status、user_authorization_level 等。这些可以创建一次并嵌套在新类中以实现更多功能特定的用户操作,例如更新用户的帐户:

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

Run Code Online (Sandbox Code Playgroud)