通过项目来深入理解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)