首先我们还是先分析思路
1、接收参数(手机号,密码)
2、判断接收的参数是否齐全
3、判断手机号是否是合法的
3.1用正则验证手机号的合法性
4、对比用户传入的密码和数据库的值进行对比
4.1从数据库取值进行比较
5、更新session,提交数据
6、返回结果
以下是代码
1 def login(): 2 #接收参数 3 res_list = request.json 4 mobile = res_list.get('mobile') 5 password = res_list.get('password') 6 #判断参数受否齐全 7 if not all([mobile,password]): 8 return jsonify(error=RET.PARAMERR,errmsg="缺失参数") 9 #判断手机号是否合法 10 if not re.match("^1[37895][0-9]{9}$",mobile): 11 return jsonify(error=RET.PARAMERR, errmsg="非法手机号") 12 #从数据库中查询用户的信息,同时检测异常 13 try: 14 user = User.query.filter(User.mobile == mobile).first() 15 except Exception as e: 16 current_app.logger.error(e) 17 return jsonify(error=RET.DBERR, errmsg="数据库查询失败") 18 #判断密码是否正确 19 if not user.check_password(password): 20 return jsonify(error=RET.PARAMERR, errmsg="账号或者密码错误") 21 #修改session值以用于登录 22 session['id'] = user.id 23 session['nick_name'] = user.nick_name 24 session['mobile'] = user.mobile 25 26 #更新用户最后一次登录时间 27 user.last_login = datetime.datetime.now() 28 #提交数据 29 try: 30 db.session.commit() 31 except Exception as e: 32 current_app.logger.error(e) 33 db.session.rollback() 34 return jsonify(error=RET.DATAERR,errmsg="数据库写入失败") 35 #返回结果 36 return jsonify(error=RET.OK, errmsg="登录成功")
其中在19行代码中我们调用了user.check_password(password) check_password()这个函数,这个函数是我们自己在模型类中
定义的函数,用于对比密码的.
1 class User(BaseModel, db.Model): 2 """用户""" 3 __tablename__ = "info_user" 4 5 id = db.Column(db.Integer, primary_key=True) # 用户编号 6 nick_name = db.Column(db.String(32), unique=True, nullable=False) # 用户昵称 7 password_hash = db.Column(db.String(128), nullable=False) # 加密的密码 8 mobile = db.Column(db.String(11), unique=True, nullable=False) # 手机号 9 avatar_url = db.Column(db.String(256)) # 用户头像路径 10 last_login = db.Column(db.DateTime, default=datetime.now) # 最后一次登录时间 11 is_admin = db.Column(db.Boolean, default=False) 12 signature = db.Column(db.String(512)) # 用户签名 13 gender = db.Column( # 订单的状态 14 db.Enum( 15 "MAN", # 男 16 "WOMAN" # 女 17 ), 18 default="MAN") 19 @property 20 def password(self): 21 return "you can't read" 22 23 @password.setter 24 def password(self, value): 25 self.password_hash = generate_password_hash(value) 26 27 def check_password(self,value): 28 return check_password_hash(self.password_hash,value)
这里我们可以看到我们是直接在User类里面创建的这个方法,这里我们为了方便一点就用了@property这个装饰器
@property这个装饰器的作用就是将类中的方法变成属性,以便于可以直接用类名去调用
下面是前端的代码
1 $(".login_form_con").submit(function (e) { 2 e.preventDefault() 3 var mobile = $(".login_form #mobile").val() 4 var password = $(".login_form #password").val() 5 6 if (!mobile) { 7 $("#login-mobile-err").show(); 8 return; 9 } 10 11 if (!password) { 12 $("#login-password-err").show(); 13 return; 14 } 15 16 // 发起登录请求 17 var params = { 18 'mobile':mobile, 19 'password':password 20 }; 21 22 $.ajax({ 23 url:'/passport/login', 24 type:'post', 25 data:JSON.stringify(params), 26 contentType:'application/json', 27 headers:{'X-CSRFToken':getCookie('csrf_token')}, // 在请求头中带上csrf_token 28 success:function (response) { 29 if (response.errno == '0') { 30 // 登录成功后刷新当前界面 31 location.reload(); 32 } else { 33 alert(response.errmsg); 34 } 35 } 36 }); 37 })