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)
运行结果: