DRF使用simple JWT身份验证的实现
作者:一切如来心秘密 发布时间:2022-01-14 12:09:00
前言
在Django的前后端分离项目中DRF(Django Restframe Work)
框架无疑是首选,关于token验证一般使用的是JWT,但是JWT只支持到Django1.x的版本。
官方推荐Django2.x之后的版本使用simple JWT
,官方文档。
登录返回token和refresh
user 模型类:
我user模型类继承的是django.contrib.auth.models.AbstractUser
,这样可以使用Django自带的认证。
如果继承该类,我们就必须在settings中配置 AUTH_USER_MODEL = "users.UserProfile"
from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserProfile(AbstractUser):
"""
用户
"""
name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名")
birthday = models.DateField(null=True, blank=True, verbose_name="出生年月")
gender = models.CharField(max_length=6, choices=(("male", u"男"), ("female", "女")), default="female", verbose_name="性别")
mobile = models.CharField(null=True, blank=True, max_length=11, verbose_name="电话")
email = models.CharField(max_length=100, null=True, blank=True, verbose_name="邮箱")
class Meta:
verbose_name = "用户"
verbose_name_plural = "用户"
def __str__(self):
return self.username
序列化文件:
注意这里使用的User
是Django管理的user模型类,要从django.contrib.auth.get_user_model
实例化获取。
在users
模块的serializers.py
文件中写如下序列化类继承自rest_framework_simplejwt.serializers.TokenObtainPairSerializer
:
from django.contrib.auth import get_user_model
User = get_user_model()
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['name'] = user.username
return token
def validate(self, attrs):
"""
登录返回token和refresh
:param attrs:
:return:
"""
data = super().validate(attrs)
data['token'] = str(data["access"])
return data
根据官方文档的说明,get_token
方法之所以设置token['name']
是因为程序可能运行在集群上,这里不写也可以。
编写视图类:
from users.serializers import MyTokenObtainPairSerializer
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
编写url:
其中api/token/
和api/token/refresh/
两个URL是simple JWT自带的token方法:
api/token/
用于获取tokenapi/token/refresh/
用于刷新token
from django.conf.urls import url
from django.urls import include, path
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
# simple jwt 认证接口
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('login/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
]
settings配置SIMPLE_JWT:
这是对token的一些自定义设置包括获取的token和refresh的生命周期等配置,通过查看rest_framework_simplejwt
的源码可以发现有很多自定义配置,感兴趣的小伙伴可以通过查看官方文档了解更多,这里我只配置了获取的token的生命周期。
启动程序访问:
可以发现返回了三个值:
refresh:是刷新token用的,当前端token过期需要刷新token的时候就可以访问前边说的
api/token/refresh
url,参数就是refresh的值。access:这个就是token但是框架里叫做access。
token:这个是在序列化文件中给access新命名了一个值,方便前端获取:
def validate(self, attrs):
"""
登录返回token和refresh
:param attrs:
:return:
"""
data = super().validate(attrs)
data['token'] = str(data["access"])
return data
注册返回token
视图类:
在视图类中导入
from rest_framework_simplejwt.tokens import RefreshToken
重写
create
方法,需要通过前边导入的RefreshToken
来获取token
返回给前端。
from django.contrib.auth import get_user_model
from django.db.models import Q
from rest_framework.response import Response
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework.mixins import CreateModelMixin
from rest_framework import viewsets
from rest_framework import status
from users.serializers import (
UserRegSerializer
)
from .models import VerifyCode
User = get_user_model()
class UserViewSet(CreateModelMixin, viewsets.GenericViewSet):
"""
用户
"""
serializer_class = UserRegSerializer
queryset = User.objects.all()
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = self.perform_create(serializer)
ret_dict = serializer.data
refresh = RefreshToken.for_user(user)
access_token = str(refresh.access_token)
ret_dict["token"] = access_token
headers = self.get_success_headers(serializer.data)
return Response(ret_dict, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
return serializer.save()
来源:https://blog.csdn.net/qq_42586468/article/details/112524452
猜你喜欢
- (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接) 网站的数据库连接语句为:Ser
- Pytorch损失函数torch.nn.NLLLoss()在各种深度学习框架中,我们最常用的损失函数就是交叉熵(torch.nn.Cross
- 总的来说:1、数据库设计和表创建时就要考虑性能2、sql的编写需要注意优化3、分区、分表、分库设计表的时候:1、字段避免null值出现,nu
- 本文实例讲述了Python实现基于PIL和tesseract的验证码识别功能。分享给大家供大家参考,具体如下:之前搞这个搞了一段时间,后面遇
- 曾经为看别人写的杂乱代码而头痛吗?曾经为看BWindow代码而烦恼吗?曾经为减小JS体积和JS的可读性之间的矛盾而左右徘徊吗?最好的办法是有
- 今天在公司实在没有事做,突然就想到写下商城的购物车的前端框架,当然我这里只有购物车的增删改查,也许写的并不是那么完善,但最重要的是一个入门,
- 本文实例为大家分享了python实现图片中文字分割的具体代码,供大家参考,具体内容如下1、原始图片(包含数字):结果图:2、原始图片(包含文
- 在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式
- 在利用torch.max函数和F.Ssoftmax函数时,对应该设置什么维度,总是有点懵,遂总结一下:首先看看二维tensor的函数的例子:
- 概要贝叶斯网络是一种基于概率的图模型,可用于建立变量之间的条件概率关系。在拼写检查器中,贝叶斯网络可以通过建立一个隐含状态、错误观察值和正确
- 首先,我们来看一个Python抓取网页的库:urllib或urllib2。那么urllib与urllib2有什么区别呢?可以把urllib2
- 我们的搜索示例仍然相当地简单,特别从数据验证方面来讲;我们仅仅只验证搜索关键值是否为空。 然后许多HTML表单包含着比检测值是否为空更为复杂
- 本文实例讲述了vue实现图片懒加载的方法。分享给大家供大家参考,具体如下:vue图片懒加载使用首先第一步,安装插件vue-lazyloadn
- 1. txt文件(1) 单位矩阵即主对角线上的元素均为1,其余元素均为0的正方形矩阵。在NumPy中可以用eye函数创建一个这样的二维数组,
- 在 做一些天气预报或者RSS订阅的程序时,往往需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过http请求访问url地址,
- 回调函数定义回调函数是把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。eg:js接口回
- 什么是Canvas<canvas> 是一个新的 HTML 元素,这个元素在 HTML5&
- pycharm指定python路径,pycharm配置python环境的方法是:1、依次点击【File】、【Project Interpre
- 一、愉客行车程监控并通知大概思路:用户填写指定信息在config.json文件中,通过定时访问网页,获取指定信息,从而达到对指定车程的监控1
- 概述从前面的对Python基础知识方法介绍中,我们几乎是围绕Python内置方法进行探索实践,比如字符串、列表、字典等数据结构的内置方法,和