Flask接口开发过程中的心得2019.10.03
完善了一下慕课网实战中的post接口开发,得到了一些进步:
代码如下:
1 #coding=utf-8 2 from flask import Flask 3 from flask import request 4 from flask import jsonify 5 app = Flask(__name__) 6 7 # GET请求接口: https://192.168.1.101:5000/ 8 @app.route('/') 9 def Home(): 10 data = { 11 "username": "cskczy", 12 "password": "Aa111111" 13 } 14 return jsonify(data) 15 16 # GET请求接口: https://192.168.1.101:5000/passport/user/login 17 @app.route('/passport/user/login', methods=['GET']) 18 def Login(): 19 username = request.args.get("username") 20 password = request.args.get("password") 21 if username and password: 22 data = { 23 "username": username, 24 "password": password, 25 "code": "200", 26 "message": "登录成功" 27 } 28 else: 29 data = { 30 "code": "400", 31 "message": "请传递正确的参数" 32 } 33 return jsonify(data) 34 35 # POST请求接口: https://192.168.1.101:5000/passport/user/post_login 36 @app.route('/passport/user/post_login', methods=['POST']) 37 def post_login(): 38 request_method = request.method 39 if request_method == 'POST': 40 username = request.form.get('username') 41 password = request.form.get('password') 42 if username is None or password is None: 43 data = { 44 "code": 400, 45 "message": "用户名或密码参数不存在" 46 } 47 elif username == "" or password == "": 48 data = { 49 "code": 400, 50 "message": "用户名或密码为空" 51 } 52 elif username == username and password == password: 53 data = { 54 "username": username, 55 "password": password, 56 "code": 200, 57 "message": "登陆成功" 58 } 59 else: 60 data = { 61 "code": "400", 62 "message": "请求不合法" 63 } 64 return jsonify(data) 65 66 67 if __name__ == "__main__": 68 app.run(host="0.0.0.0", port=5000, debug=False)
今晚在进行POST接口编写的时候,没有注意到elif之间的关系,后来去查了一下资料,进一步了解了if和elif,以及elif自身之间存在的那层关系。
举个栗子:
1 a = 5 2 if a < 6: #条件1 3 print(1) 4 if a < 7: #条件2 5 print(2) 6 else: 7 print(3)
结果:条件1和条件2是独立的,第一次判断a的值小于6,所以打印出数字1,第二次判断a的值小于7,所以打印出2。如果所有的if语句都判断失败,才会执行else后的语句,否则else语句不执行。
条件1和条件2的结果都会打印。
如果条件2修改为elif,结果就不同了
1 a = 5 2 if a < 6: #条件1 3 print(1) 4 elif a < 7: #条件2 5 print(2) 6 else: 7 print(3)
这次条件1和条件2是相关的,也就是说,如果条件1判断成功的话,条件2就不会继续判断了。反过来,如果条件1判断失败,那么就会继续判断条件2.如果条件1和条件2都判断失败,那么则执行else里面的语句。
结果很明显就是只会打印出1。
当然把if和elif混合起来也是可以的,只不过这样看起来怪怪的,可读性也差
1 a = 5 2 if a < 6: 3 print(1) 4 elif a < 4: 5 print(2) 6 if a < 7: 7 print(3) 8 else: 9 print(4)
结果是:1,3
应用场景:
如果你只想执行一个代码块,那么用if-elif-else结构吧;
如果你要运行多个代码块,那么就用多个if吧。(多条件同时满足)
我今晚遇到的疑惑如下:
刚开始把模块2放在了模块1的上面。所以在postman进行接口参数请求的时候,
我的username和password参数为空,却返回了:
{
"code": 200,
"message": "登陆成功",
"password": " ",
"username": " "
}
显示这与我预期的结果不符合,我要的是username或password任意一个为空的时候,返回:
{
"code": 400,
"message": "用户名或密码为空"
}
现在我知道了因为模块2在模块1之前,模块2的代码逻辑是允许username或password为空的,
模块2执行后,因为是elif的缘故,并不会再去执行模块1的代码,所以才会返回请求参数为空,登录成功的情况。
我只需要把限制条件范围比较小的放到前面,按照这样的层级关系,就可以实现自己的需求。