Flask-RESTful请求参数验证处理

本文详细介绍了Flask-Restful插件中的参数验证和解析功能,利用RequestParser类进行数据检验和转换。通过add_argument方法设置字段规则,包括默认值、是否必须、数据类型、验证选项、错误信息等。还展示了如何处理多个同名参数、参数位置以及各种类型的参数验证,如正则表达式、日期、URL等。最后,提供了一个综合示例,演示了如何综合运用这些参数进行验证。
摘要由CSDN通过智能技术生成

1、参数验证/解析

        参数验证也叫参数解析。

        Flask-Restful插件提供了类似WTForms来验证提交的数据是否合法的包,叫做reqparse。提供了RequestParser类,用来帮助我们检验和转换请求数据。

基本用法

1. 通过 flask_restful.reqparse 中 RequestParser 建立解析器

2. 通过 RequestParser 中的 add_argument 方法定义字段与解析规则

3. 通过 RequestParser 中的 parse_args 来解析参数,启动检验处理

  • 解析正确,返回正确参数
  • 解析错误,返回错误信息给前端

4.检验之后从检验结果中获取参数时可按照字典操作或对象属性操作

args.rate
或
args['rate']

# 解析数据
args = parser.parse_args()
print(args)
print({"name": args.uname, 'name2': args['uname']})

示例代码:

from flask import Flask
from flask_restful import Api, Resource
from flask_restful.reqparse import RequestParser

app = Flask(__name__)
api = Api(app)


class RegisterView(Resource):
    def post(self):
        # 建立解析器
        parser = RequestParser()
        # 定义数据的解析规则
        parser.add_argument('name', type=str, required=True, help='用户名验证错误', trim=True)  # 会将其它格式自动转换为str格式
        parser.add_argument('age', type=int, required=True, help='年龄验证错误', trim=True)
        # 解析数据
        args = parser.parse_args()
        # 正确,直接获取参数
        print(args)
        # 错误,回馈到前端

        # 响应数据
        return {'msg': '注册成功!!'}


# 建立映射关系
api.add_resource(RegisterView, '/register')

if __name__ == '__main__':
    app.run(debug=True)

运行结果:

2、add_argument方法参数

add_argument方法可以指定这个字段的名字,这个字段的数据类型等,验证错误提示信息等。

2.1 default

        默认值,如果这个参数没有值,那么将使用这个参数指定的默认值。

2.2 required

是否必须。默认为False,如果设置为True,那么这个参数就必须提交上来。描述请求是否一定要携带对应参数,默认值为False

  • True 强制要求携带

    若未携带,则校验失败,向客户端返回错误信息,状态码400

  • False 不强制要求携带

    若不强制携带,在客户端请求未携带参数时,取出值为None

class DemoResource(Resource):
    def get(self):
        rp = RequestParser()
        rp.add_argument('a', required=False)
        args = rp.parse_args()
        return {'msg': 'data={}'.format(args.a)}

示例代码:

from flask import Flask, Blueprint
from flask_restful import Api, Resource, reqparse

app = Flask(__name__)

user_bp = Blueprint('user', __name__)

user_api = Api(user_bp)


class DemoResource(Resource):
    def get(self):
        rp = reqparse.RequestParser()
        rp.add_argument('a', required=False)
        args = rp.parse_args()
        return {'msg': 'data={}'.format(args.a)}


user_api.add_resource(DemoResource, '/')

app.register_blueprint(user_bp)

app.run()

运行效果:

 

2.3 type

        描述参数应该匹配的类型,这个参数的数据类型,如果指定,那么将使用指定的数据类型来强制转换提交上来的值。可以使用python自带的一些数据类型(如str或者int),也可以使用flask_restful.inputs下的一些特定的数据类型来强制转换。

2.3.1 标准类型
rp.add_argument('a', type=int, required=True, help='missing a param', action='append')
2.3.2 Flask-RESTful提供
  • url:会判断这个参数的值是否是一个url,如果不是,那么就会抛出异常。
  • regex:正则表达式。
  • date:将这个字符串转换为datetime.date数据类型。如果转换不成功,则会抛出一个异常。

检验类型方法在flask_restful.inputs模块中

  • url

  • regex(指定正则表达式)

    from flask_restful import inputs
    rp.add_argument('a', type=inputs.regex(r'^\d{2}&'))
    
  • natural 自然数0、1、2、3...

  • positive 正整数 1、2、3...

  • int_range(low ,high) 整数范围
rp.add_argument('a', type=inputs.int_range(1, 10))
  • boolean

  • 自定义
def mobile(mobile_str):
    """
    检验手机号格式
    :param mobile_str: str 被检验字符串
    :return: mobile_str
    """
    if re.match(r'^1[3-9]\d{9}$', mobile_str):
        return mobile_str
    else:
        raise ValueError('{} is not a valid mobile'.format(mobile_str))

rp.add_argument('a', type=mobile)

2.4 choices

        固定选项。提交上来的值只有满足这个选项中的值才符合验证通过,否则验证不通过。

2.5 help

        错误信息。如果验证失败后,将会使用这个参数指定的值作为错误信息。参数检验错误时返回的错误描述信息。

rp.add_argument('a', required=True, help='missing a param')

2.6 trim

        是否要去掉前后的空格。

2.7 action

描述对于请求参数中出现多个同名参数时的处理方式

  • action='store' 保留出现的第一个, 默认
  • action='append' 以列表追加保存所有同名参数的值
rp.add_argument('a', required=True, help='missing a param', action='append')

2.8 location

描述参数应该在请求数据中出现的位置:

# Look only in the POST body
parser.add_argument('name', type=int, location='form')

# Look only in the querystring
parser.add_argument('PageSize', type=int, location='args')

# From the request headers
parser.add_argument('User-Agent', location='headers')

# From http cookies
parser.add_argument('session_id', location='cookies')

# From json
parser.add_argument('user_id', location='json')

# From file uploads
parser.add_argument('picture', location='files')

也可指明多个位置:

parser.add_argument('text', location=['headers', 'json'])

2.9 实例综合演示

示例代码:

from flask import Flask
from flask_restful import Api, Resource, inputs
from flask_restful.reqparse import RequestParser

app = Flask(__name__)
api = Api(app)


class RegisterView(Resource):
    def post(self):
        # 建立解析器
        parser = RequestParser()
        # 定义解析规则
        parser.add_argument('uname', type=str, required=True, trim=True, help='用户名不符合规范')
        parser.add_argument('pwd', type=str, help='密码错误', default='123456')
        parser.add_argument('age', type=int, help='年龄验证错误!')
        parser.add_argument('gender', type=str, choices=['男', '女', '保密'], help='性别验证错误')
        parser.add_argument('birthday', type=inputs.date, help='生日验证错误')
        parser.add_argument('phone', type=inputs.regex('^1[356789]\d{9}$'), help='电话验证错误')
        parser.add_argument('homepage', type=inputs.url, help='个人主页验证错误')
        # 解析数据
        args = parser.parse_args()
        print(args)
        return {'msg': '注册成功!'}


api.add_resource(RegisterView, '/register/')

if __name__ == '__main__':
    app.run(debug=True)

运行结果:

`Flask-RESTful` 是 Flask 的一个扩展,它使创建 RESTful API 变得更加容易。使用 Flask-RESTful,你可以使用 Python 类来定义资源(Resource),并使用 Flask 的路由系统来将 URL 映射到这些资源上。 Flask-RESTful 提供了一组类和方法来处理 HTTP 请求和响应,例如 `Resource`、`Api`、`reqparse` 等。其中,`Resource` 类表示一个 RESTful 资源,它封装了 HTTP 请求和响应的处理逻辑。`Api` 类表示整个 RESTful API,它可以将多个资源组合在一起,并将它们映射到 URL 上。`reqparse` 类用于解析和验证 HTTP 请求参数。 下面是一个简单的使用 Flask-RESTful 的示例: ``` from flask import Flask from flask_restful import Api, Resource, reqparse app = Flask(__name__) api = Api(app) class HelloWorld(Resource): def get(self): return {'hello': 'world'} api.add_resource(HelloWorld, '/') if __name__ == '__main__': app.run(debug=True) ``` 在上面的示例中,`HelloWorld` 类继承自 `Resource` 类,表示一个 RESTful 资源。`get()` 方法表示处理 HTTP GET 请求的逻辑,它返回一个 JSON 响应。`api.add_resource()` 方法将 `HelloWorld` 资源映射到根 URL 上。当用户访问根 URL 时,Flask-RESTful 将自动调用 `HelloWorld` 资源的 `get()` 方法,并返回 JSON 响应。 Flask-RESTful 还支持其他 HTTP 方法,例如 POST、PUT、DELETE 等。你可以根据实际需求定义不同的资源和方法,以创建一个完整的 RESTful API。 总之,Flask-RESTful 是一个非常方便的 Flask 扩展,可以帮助你轻松地创建 RESTful API,从而提供 Web 服务和数据接口。它提供了一组类和方法,使 HTTP 请求和响应的处理变得更加简单和易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值