首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Webargs Flaskparser验证URL路径中的变量参数和查询参数

使用Webargs Flaskparser验证URL路径中的变量参数和查询参数
EN

Stack Overflow用户
提问于 2018-08-06 01:38:19
回答 1查看 2.5K关注 0票数 2

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

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

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

代码语言:javascript
复制
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中。

EN

回答 1

Stack Overflow用户

发布于 2018-08-06 07:06:05

在探索了一段时间之后,我发现了解决方案,现在我在webargs flaskparser documentation中看到了它

除了参数中的其他use_args location参数之外,还可以很容易地使用该参数。看起来,请求方法函数getpost等仍然需要传入该url变量。在我的例子中,它是<username>

代码语言:javascript
复制
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
        )
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51696757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档