【问题标题】:Validate Variable Parameters In URL Path and Query Parameters using Webargs Flaskparser使用 Webargs Flaskparser 验证 URL 路径和查询参数中的变量参数
【发布时间】:2019-01-12 18:31:09
【问题描述】:

我正在尝试验证发送到我的 api 的所有数据。我的 url 结构中包含一个变量/api/v2/users/<string:username>/collections/,以及实际的查询字符串参数,所有这些都需要通过验证。

完整的网址如下所示: https://127.0.0.1:5000/api/v2/users/<string:username>/collections/?page=5&per_page=10

需要验证的两个变量是:usernamepage,和per_page。简单的解决方案是更改我的 url 结构,但我想知道是否有可能完成我所需要的并保持我目前拥有的简单性,而无需在我的资源类中添加额外的验证。如果可以,你是怎么做到的?

class UserCollections(Resource):
    @use_args({
        'username': fields.Str(
            required=True,
            validate=username_length,
            error_messages=dict(
                required='Username is required.',
                validator_failed='Username can be between 3 and 25 characters.',
            )
        ),
        'page': fields.Int(
            #required=True,
            missing=1,
            validate=feed_minmax_pages,
            error_messages=dict(
                validator_failed='Maximum number of pages reached.',
            )
        ),
        'per_page': fields.Int(
            #required=True,
            missing=5,
            validate=validate.Range(min=5,max=25),
            error_messages=dict(
                validator_failed='Test number of pages reached.',
            )
        ),
    }, locations=('query',))

    def get(self, args, username):
        print(args)
        print(username)

        return default_schema(
            data={},
            http_status=200
        )

当我运行代码时,我收到username 的验证错误,因为它在 args 中不存在。

【问题讨论】:

    标签: python python-3.x flask webargs


    【解决方案1】:

    经过一段时间的探索,我发现了解决方案,现在我在 webargs flaskparser documentation 中看到了该解决方案

    除了参数中的其他 use_args location 参数外,它还可以轻松使用。看来请求方法函数getpost 等仍然需要您传入该url 变量。就我而言,它是<username>

    class UserCollections(Resource):
        @use_args({
            'username': fields.Str(
                location='view_args',
                required=True,
                validate=username_length,
                error_messages=dict(
                    required='Username is required.',
                    validator_failed='Username can be between 3 and 25 characters.',
                )
            ),
            'page': fields.Int(
                location='query',
                missing=1,
                validate=feed_minmax_pages,
                error_messages=dict(
                    validator_failed='Maximum number of pages reached.',
                )
            ),
            'per_page': fields.Int(
                location='query',
                missing=5,
                validate=validate.Range(min=5,max=25),
                error_messages=dict(
                    validator_failed='Test number of pages reached.',
                )
            ),
        })
    
        def get(self, args, username):
            print(args) # access with args['username']
            print(username) # would be nice to not have a second of the same var
    
            return default_schema(
                data={},
                http_status=200
            )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 2012-10-07
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多