Django 登录接口,返回token

Posted beautyl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 登录接口,返回token相关的知识,希望对你有一定的参考价值。

完成login之后返回token的接口,包括生成token,form校验,连接redis,view逻辑

1,在该子项目下新建utils.py ,存放生成token的类

 1 from django_redis import get_redis_connection
 2 import itsdangerous
 3 # 获取/解析token用到的模块
 4 from django.conf import settings
 5 # 把settings中的一串字符串作为 secretkey
 6 from .const import token_expires
 7 class Token:
 8     # 获取/解析token的类
 9     tjss = itsdangerous.TimedJSONWebSignatureSerializer(settings.SECRET_KEY, expires_in=token_expires)
10     # 把settings中的一串字符串作为 secretkey
11     # 设置一个失效时间
12     @classmethod
13     def create_token(cls,data):
14         token=cls.tjss.dumps(data).decode()
15         # data是根据什么获取的token,比如根据用户的用户名和密码
16         return token
17     @classmethod
18     def check_token(cls,token):
19         try:
20             data=cls.tjss.loads(token)
21             # 解析传过来的token,比如,解析成用户的用户名和密码
22         except:
23             # 如果解析失败的话。程序会报错。所以这里加了异常处理,如果解析失败,返回false即可
24             return False
25         return data

2,form校验

 1 class LoginForm(forms.Form,FormatFormError):
 2     # login form
 3     # 校验,1,传入的参数username和password数据类型是否合法
 4     # 2,username和password在sqlite数据库中能否查到,登录的信息是否正确
 5     username=forms.CharField(max_length=50)
 6     password=forms.CharField(max_length=50)
 7     def clean(self):
 8         username=self.cleaned_data.get(username)
 9         password=self.cleaned_data.get(password)
10         # 获取传到form中的参数  字典类型
11         u=models.User.objects.filter(username=username,password=password).first()
12         # 去数据表中查找这条数据
13         if u:
14             self.cleaned_data[u]=u
15             print(self.cleaned_data)
16             # 如果查到了,表明用户信息合法,并且把这条Model信息存到cleandata中
17         else:
18             raise ValidationError(账号/密码错误!)
19             # 如果查不到,直接报异常,用户信息校验失败

3,views

 1 class LoginView(View):
 2     ‘‘‘loginview‘‘‘
 3     def get(self,request):
 4         # 现在要做的登录返回token是get请求
 5         form=LoginForm(request.GET)
 6         # 把请求参数传给form,实例化form
 7         if form.is_valid():
 8             id=form.cleaned_data.get(u).id
 9             username=form.cleaned_data.get(u).username
10             # 如果校验通过,想取到这条model的id和name拼接成字典,作为加密的原始数据
11             data={id:id,username:username}
12             token=Token.create_token(data)
13             # 生成token
14             r=get_redis_connection()
15             # 建立redis的连接
16             key=session_pre+username
17             # redis中的key统一成,session:username的格式
18             r.set(key,token,token_expires)
19             # r.set(key,token)
20             return Nbreponse(username=username,token=token)
21             # 请求成功,就返回token给用户
22         else:
23             return Nbreponse(-1,form.error_msg)

 

以上是关于Django 登录接口,返回token的主要内容,如果未能解决你的问题,请参考以下文章

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

Django上自建一个token校验机制

我无法使用有效的用户名和密码登录 Django 管理页面,它返回 % csrf_token % 禁止的 404 错误消息

我可以通过 django-rest-auth 登录和注册返回 JSON Web Token (JWT) 吗?

登录接口返回的cookie中有多个token

python接口自动化之token登录