通过项目来深入理解tornado(五):登录功能实现
通过项目来深入理解tornado(五):登录功能实现
登录这块其实挺简单的,我没有使用传统的seesion而是使用了jwt
也就是json web token,关于这个,可以戳这里
先上代码,后面解释
class LoginHandler(RequestHandler):
async def post(self, *args, **kwargs):
params = json.loads(self.request.body.decode('utf8'))
form = LoginForm.from_json(params)
re_data = {}
if form.validate():
# 登录逻辑
mobile = form.mobile.data
password = form.password.data
try:
user = await self.application.objects.get(User, mobile=mobile)
if user.password.check_password(password):
data = {
'id':user.id,
'nick_name':user.nick_name,
'exp':datetime.utcnow()
}
# 生成json web token
token = jwt.encode(data, self.settings['secret_key'], algorithm='HS256')
re_data['id'] = user.id
re_data['token'] = token.decode('utf8')
else:
self.set_status(400)
re_data['non_fields'] = '用户名或者密码错误'
except User.DoseNotExist:
self.set_status(400)
re_data['mobile'] = '用户不存在'
else:
self.set_status(400)
re_data['non_fields'] = '用户名或者密码错误'
self.finish(re_data)
这里主要是之前的表单里说明了使用到了password的字段
所以在user.password.check_password(password):这里可以用这个方法来检查密码是否正确
但是不能直接验证, 因为数据库存的不是明文
然后就是jwt的使用了
data = {
'id':user.id,
'nick_name':user.nick_name,
'exp':datetime.utcnow()
}
# 生成json web token
token = jwt.encode(data, self.settings['secret_key'], algorithm='HS256')
re_data['id'] = user.id
一定要记得设置jwt的过期时间,exp = datetime.now()
总结:
1.验证密码使用user.password.check_password()
2.jwt的使用(github上的pyjwt)

浙公网安备 33010602011771号