DRF使用simple JWT身份驗(yàn)證的實(shí)現(xiàn)
前言
在Django的前后端分離項(xiàng)目中DRF(Django Restframe Work)框架無(wú)疑是首選,關(guān)于token驗(yàn)證一般使用的是JWT,但是JWT只支持到Django1.x的版本。
官方推薦Django2.x之后的版本使用simple JWT,官方文檔。
登錄返回token和refresh
user 模型類:
我user模型類繼承的是django.contrib.auth.models.AbstractUser,這樣可以使用Django自帶的認(rèn)證。
如果繼承該類,我們就必須在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實(shí)例化獲取。
在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
根據(jù)官方文檔的說(shuō)明,get_token方法之所以設(shè)置token['name']是因?yàn)槌绦蚩赡苓\(yùn)行在集群上,這里不寫也可以。
編寫視圖類:
from users.serializers import MyTokenObtainPairSerializer class MyTokenObtainPairView(TokenObtainPairView): serializer_class = MyTokenObtainPairSerializer
編寫url:
其中api/token/和api/token/refresh/兩個(gè)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 認(rèn)證接口
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:
這是對(duì)token的一些自定義設(shè)置包括獲取的token和refresh的生命周期等配置,通過(guò)查看rest_framework_simplejwt的源碼可以發(fā)現(xiàn)有很多自定義配置,感興趣的小伙伴可以通過(guò)查看官方文檔了解更多,這里我只配置了獲取的token的生命周期。
啟動(dòng)程序訪問(wèn):


可以發(fā)現(xiàn)返回了三個(gè)值:
- refresh:是刷新token用的,當(dāng)前端token過(guò)期需要刷新token的時(shí)候就可以訪問(wèn)前邊說(shuō)的
api/token/refreshurl,參數(shù)就是refresh的值。 - access:這個(gè)就是token但是框架里叫做access。
- token:這個(gè)是在序列化文件中給access新命名了一個(gè)值,方便前端獲取:
def validate(self, attrs): """ 登錄返回token和refresh :param attrs: :return: """ data = super().validate(attrs) data['token'] = str(data["access"]) return data
注冊(cè)返回token
視圖類:
- 在視圖類中導(dǎo)入
from rest_framework_simplejwt.tokens import RefreshToken - 重寫
create方法,需要通過(guò)前邊導(dǎo)入的RefreshToken來(lái)獲取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()
到此這篇關(guān)于DRF使用simple JWT身份驗(yàn)證的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)DRF使用simple JWT身份驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python drf各類組件的用法和作用
- DRF框架API版本管理實(shí)現(xiàn)方法解析
- Django DRF APIView源碼運(yùn)行流程詳解
- Django DRF認(rèn)證組件流程實(shí)現(xiàn)原理詳解
- Django DRF路由與擴(kuò)展功能的實(shí)現(xiàn)
- django drf框架自帶的路由及最簡(jiǎn)化的視圖
- django drf框架中的user驗(yàn)證以及JWT拓展的介紹
- Django框架之DRF 基于mixins來(lái)封裝的視圖詳解
- DRF跨域后端解決之django-cors-headers的使用
- django DRF圖片路徑問(wèn)題的解決方法
相關(guān)文章
python+matplotlib繪制簡(jiǎn)單的海豚(頂點(diǎn)和節(jié)點(diǎn)的操作)
這篇文章主要介紹了python+matplotlib繪制簡(jiǎn)單的海豚(頂點(diǎn)和節(jié)點(diǎn)的操作),具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Android模擬器無(wú)法啟動(dòng),報(bào)錯(cuò):Cannot set up guest memory ‘a(chǎn)ndroid_arm’ I
這篇文章主要介紹了Android模擬器無(wú)法啟動(dòng),報(bào)錯(cuò):Cannot set up guest memory ‘a(chǎn)ndroid_arm’ Invalid argument的解決方法,通過(guò)模擬器ram設(shè)置的調(diào)整予以解決,需要的朋友可以參考下2016-07-07
手把手教你Python yLab的繪制折線圖的畫(huà)法
這篇文章主要介紹了手把手教你Python yLab的繪制折線圖的畫(huà)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Python實(shí)戰(zhàn)之MNIST手寫數(shù)字識(shí)別詳解
MNIST數(shù)據(jù)集是機(jī)器學(xué)習(xí)領(lǐng)域中非常經(jīng)典的一個(gè)數(shù)據(jù)集,由60000個(gè)訓(xùn)練樣本和10000個(gè)測(cè)試樣本組成,每個(gè)樣本都是一張28 * 28像素的灰度手寫數(shù)字圖片。本文主要介紹了通過(guò) MNIST實(shí)現(xiàn)手寫數(shù)字識(shí)別,需要的可以參考一下2022-01-01
Django admin model 漢化顯示文字的實(shí)現(xiàn)方法
今天小編就為大家分享一篇Django admin model 漢化顯示文字的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
python數(shù)據(jù)持久存儲(chǔ) pickle模塊的基本使用方法解析
這篇文章主要介紹了python數(shù)據(jù)持久存儲(chǔ) pickle模塊的基本使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
使用python?pywin32模塊創(chuàng)建windows服務(wù)實(shí)例探究
這篇文章主要為大家介紹了使用python?pywin32模塊創(chuàng)建windows服務(wù)實(shí)現(xiàn)實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python 代碼在函數(shù)中運(yùn)行得更快的原因解析
我們知道,python 是一種解釋型語(yǔ)言,它會(huì)逐行讀取并執(zhí)行代碼,小伙伴們可能會(huì)有這個(gè)疑問(wèn):為什么在函數(shù)中運(yùn)行的 Python 代碼速度更快,今天這篇文章將會(huì)解答大家心中的疑惑2023-09-09

