Django 登录接口,返回token

完成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)

相关推荐