如何为不同的请求添加不同的烧瓶静态reqparse要求

时间:2019-12-02 20:20:31

标签: python flask flask-restful

我正在创建一个这样的登录端点作为示例:

from flask_restful import reqparse

parser = reqparse.RequestParser()
parser.add_argument('email', help = 'This field cannot be blank', required = True)
parser.add_argument('password', help = 'This field cannot be blank', required = True)

class UserLogin(Resource):
    def post(self):
        data = parser.parse_args()
        current_user = User.find_by_email(data['email'])

        if not current_user:
            return {
            .
            .
            .

问题在于,现在必须同时提供两个参数(电子邮件和密码均相同)。但是,如果我想创建另一个只需要其中一个作为填充字段的终结点类,该怎么办?显然,删除required = True参数可以解决此问题,但这会破坏class UserLogin的验证逻辑。

是否有现成的资源或模式可以做到这一点?

1 个答案:

答案 0 :(得分:1)

解析器继承

通常,您会对编写的每个资源进行不同的解析器。问题在于解析器是否具有相同的参数。您可以编写包含所有共享参数的父解析器,而不用重写参数,然后使用 copy()扩展解析器。您还可以使用 replace_argument()覆盖父级中的任何参数,或者使用 remove_argument()完全删除该参数。例如:

from flask_restful import reqparse

parser = reqparse.RequestParser()
parser.add_argument('foo', type=int)

parser_copy = parser.copy()
parser_copy.add_argument('bar', type=int)

# parser_copy has both 'foo' and 'bar'

parser_copy.replace_argument('foo', required=True, location='json')
# 'foo' is now a required str located in json, not an int as defined
#  by original parser

parser_copy.remove_argument('foo')
# parser_copy no longer has 'foo' argument