使用Flask实现Restful接口时,需要对请求参数进行校验,判断是否满足特定规则。本文将介绍如何通过前置请求库优化验证逻辑。接口需求假设我们需要实现一个接口,用于收集用户填写的个人信息。该接口具体要求如下:接口路径:/user/info/new接口字段:字段类型描述userNamestring用户昵称,必填,2-20个字符stringgenderint用户性别,必填,1-男2-女ageintuserage,必填,18-60之间的整数countrystring用户国籍,可选,默认为中国,字符串长度>2如果没有帮助实现接口如果有第三方工具实现上述接口,代码可能看起来像这样:fromflaskimportrequest,Flaskapp=Flask(__name__)@app.route("/user/info/new",methods=["POST"])defuser_info_handler():#1.判断是否是用户名参数合法user_name=request.form.get("userName")ifnotuser_nameornotisinstance(user_name,str):return"Pleasefillinthecorrectusername"iflen(user_name)<2orlen(user_name)>20:return"用户名长度不正确"#2.判断用户性别参数是否为合法性别r=request.form.get("gender")如果不是性别:返回"请填写用户性别"try:gender=int(gender)exceptValueError:如果性别不是返回"用户性别的格式不正确"in[1,2]:return"Theparameteroftheuser'sgendermustbebetween[1,2]"#3.判断用户的等级是参数legalage=request.form.get("age")ifnotage:return"Pleasefillintheuser'sage"try:age=int(age)exceptValueError:return"用户年龄格式不正确"ifage<18orage>60:return"Theagemustbebetween18-60"#4.判断国籍是否合法country=request.form.get("country","China")country=str(country)iflen(country)<2:return"国籍名称长度不合法"#TODO:用户信息注册逻辑return"Success"if__name__=="__main__":app.run(port=8080)如上代码所示,为了保证数据库中存储的数据符合设计要求,开发者需要对入参做大量的校验工作。稍有不慎,就有可能给系统留下隐患。使用pre-request验证入参也是为了实现上面的接口需求。我们来看看如何通过pre-request来屏蔽大量重复的验证逻辑。fromflaskimportFlaskfrompre_requestimportpre,Ruleapp=Flask(__name__)rule={"userName":Rule(type=str,required=True,gte=3,lte=20,dest="user_name"),"性别":规则(type=int,required=True,enum=[1,2]),"age":Rule(type=int,required=True,gte=18,lte=60),"country":Rule(type=str,required=False,gte=2,default="China")}@app.route("/user/info/new",methods=["POST"])defuser_info_handler():params=pre.parse(rule=rule)#TODO:用户信息注册逻辑return"Success"if__name__=="__main__":app.run(port=8080)如上所示,复杂的参数验证工作变成了验证规则的编写,pre.parse函数会自动捕获请求参数并判断是否满足校验规则。如果不满足验证规则,会自动生成错误响应,用户无需做任何操作。预请求相关链接代码地址:https://github.com/Eastwu5788...文档地址:https://pre-request.readthedo...
