通過項目來深入理解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)