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