当我们完成用户注册,往项目的MySQL数据库添加了用户数据之后就可以进行对
用户登录功能的实现了
前端HTML代码的实现// 发起登录请求
var params = {
'mobile':mobile,
'password':password
};
$.ajax({
url:'/passport/login',
type:'post',
data:JSON.stringify(params),
contentType:'application/json',
headers:{'X-CSRFToken':getCookie('csrf_token')}, // 在请求头中带上csrf_token
success:function (response) {
if (response.errno == '0') {
// 登录成功后刷新当前界面
location.reload();
} else {
alert(response.errmsg);
}
}
});
将上面的代码复制到对应的代码块,和注册时一样全选然后粘贴覆盖住,对应代码块的进入前面有就不写了
前端知识补充
这样前端的代码就处理了,这里简单讲解一下jquery中的ajax(局部刷新技术)
ajax是一种无需再重新加载整个网页的情况下,能够更新部分网页的技术,它必要的参数为
URL :要求为String类型的参数,(默认为当前页地址)发送请求的地址。
type: 要求为String类型的参数,请求方式(post或get)默认为get。注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持。
success(回调函数):
要求为Function类型的参数,请求成功后调用的回调函数,有两个参数。
(1)由服务器返回,并根据dataType参数进行处理后的数据。
(2)描述状态的字符串。
function(data, textStatus){
//data可能是xmlDoc、jsonObj、html、text等等
this; //调用本次ajax请求时传递的options参数
}
登录功能也遵循了下图的接口规范,按照下图的规范进行相关代码的编写
首先建立对应的登录视图
实现登录功能的视图函数是写在注册的后面,同样是在passport的views文件里
还是先粘贴复制前面的视图代码,然后再做对应参数的修改后就完成了
完成之后还是先写文档注释,函数实现的功能
然后就是分析并写下对应的步骤,先简单的分析下吧
首先按照规范需要接收两个参数mobile和password,也就是账号和密码
然后校验参数,先整体校验参数是否齐全,然后在分开校验,这里需要先对不需要连接数据库的数据
进行先行校验,需要进行数据库连接操作的放在后面。这样比较省时间。
然后就是登录后实现状态保存,在我们写注册时就写过对应的代码,这一步将代码复制过来就行
再然后就是更新用户最后一次更新的时间,这个在我们写注册时就对数据表中的记录字段进行过修改记录的是当前
时间,代码复制过来
最后就是返回结果,成功的结果,也就是大体的五步
下面我们来一步一步实现代码的编写
第一步
# 1.接收参数(mobile,password)
mobile = request.json.get("mobile")
password = request.json.get("password")
根据接口设计图来接收对应的参数
第二步
# 2.校验参数
# 2.1 判断参数是否齐全
if not all([mobile,password]):
return jsonify(errno= RET.PARAMERR ,errmsg="参数不齐")
# 2.2 判断手机号格式是否正确
mobile = mobile.strip()
if not re.findall("^1[3|4|5|7|8][0-9]{9}$", mobile):
return jsonify(errno=RET.PARAMERR, errmsg="手机号格式有误")
# 否返回json数据
# 2.3 通过手机号判断用户是否存在
try:
user = User.query.filter_by(mobile=mobile).first() #返回的结果为布尔值
except Exception as e :
current_app.logger.error(e)
return jsonify(errno=RET.DBERR,errmsg="手机号未找到")
if not user :
return jsonify(errno=RET.NODATA,errmsg=" 未找到该用户")
# 否返回json数据
首先对接收到所有参数进行整体校验判断是否齐全
然后是对手机号格式的校验,正则,这个我们已经进行了多次了,代码复制过来就行。
然后通过手机号我们需要从我们的第三方数据库中进行数据的查询,所以需要进行异常捕捉并
处理,用用户给的手机参看数据库中是否存在数据。当我们使用first()查询器 时,数据不存在时查询结果不会报错并返回布尔值,这样
就符合我们的判断要求。
关于密码(password)的校验,因为我们存在数据库里的密码是加密后的保存的,所以不能直接拿出来和用户输入的密码进行对比,必须借助对应的
工具来进行
和加密密码一样,我们在User模型类的代码里加入一个函数,通过传入用户输入的密码来进行对比校验,然后对函数返回的结果来进行判断
这里返回的结果为布尔值。
需要用到我们的另外一个工具代码check_password_hash
对应函数的建立,这里进行对比后产生的结果为布尔值,符合我们的判断要求
然后在进行用户传入的密码的校验,通过取反来对错误内容进行处理
if not user.check_password(password):
return jsonify(errno=RET.PARAMERR,errmsg="账户或密码错误")
第三步
# 3.实现状态保持
session["user_id"] = user.id
session["nick_name"] = user.nick_name
session["mobile"] = user.mobile
和注册时一样登录完成之后写人session来进行状态保存
第四步
# 4.记录最后一次登录时间
user.last_login = datetime.datetime.now #进行数据的更改,使用datetime模块
try:
db.session.commit()
except Exception as e:
current_app.logger.error(e)
db.session.rollback()
return jsonify(errno=RET.DBERR, errmsg="登录时间更新失败")
因为我们在进行查询时就建立了对应用户数据的连接,所以当我们修改数据时通过调用类属性然后再从新赋值就可以进行
相关数据的修改,最后再提交就可以了,提交需要连接第三方数据库所以需要创建异常捕捉,处理时因为我们是修改了数据库数据
当失败时需要使用回滚,添加到一半失败是有可能的,所以当添加失败时需要变回没有更改之前。
第五步
# 5.返回结果
return jsonify(errno=RET.OK,errmsg="登录成功")