时光如瑾雨微凉 2020-05-01
完成login之后返回token的接口,包括生成token,form校验,连接redis,view逻辑
1,在该子项目下新建utils.py ,存放生成token的类
from django_redis import get_redis_connection import itsdangerous # 获取/解析token用到的模块 from django.conf import settings # 把settings中的一串字符串作为 secretkey from .const import token_expires class Token: # 获取/解析token的类 tjss = itsdangerous.TimedJSONWebSignatureSerializer(settings.SECRET_KEY, expires_in=token_expires) # 把settings中的一串字符串作为 secretkey # 设置一个失效时间 @classmethod def create_token(cls,data): token=cls.tjss.dumps(data).decode() # data是根据什么获取的token,比如根据用户的用户名和密码 return token @classmethod def check_token(cls,token): try: data=cls.tjss.loads(token) # 解析传过来的token,比如,解析成用户的用户名和密码 except: # 如果解析失败的话。程序会报错。所以这里加了异常处理,如果解析失败,返回false即可 return False return data
2,form校验
class LoginForm(forms.Form,FormatFormError): # login form # 校验,1,传入的参数username和password数据类型是否合法 # 2,username和password在sqlite数据库中能否查到,登录的信息是否正确 username=forms.CharField(max_length=50) password=forms.CharField(max_length=50) def clean(self): username=self.cleaned_data.get(‘username‘) password=self.cleaned_data.get(‘password‘) # 获取传到form中的参数 字典类型 u=models.User.objects.filter(username=username,password=password).first() # 去数据表中查找这条数据 if u: self.cleaned_data[‘u‘]=u print(self.cleaned_data) # 如果查到了,表明用户信息合法,并且把这条Model信息存到cleandata中 else: raise ValidationError(‘账号/密码错误!‘) # 如果查不到,直接报异常,用户信息校验失败
3,views
class LoginView(View): ‘‘‘loginview‘‘‘ def get(self,request): # 现在要做的登录返回token是get请求 form=LoginForm(request.GET) # 把请求参数传给form,实例化form if form.is_valid(): id=form.cleaned_data.get(‘u‘).id username=form.cleaned_data.get(‘u‘).username # 如果校验通过,想取到这条model的id和name拼接成字典,作为加密的原始数据 data={‘id‘:id,‘username‘:username} token=Token.create_token(data) # 生成token r=get_redis_connection() # 建立redis的连接 key=session_pre+username # redis中的key统一成,session:username的格式 r.set(key,token,token_expires) # r.set(key,token) return Nbreponse(username=username,token=token) # 请求成功,就返回token给用户 else: return Nbreponse(-1,form.error_msg)