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
文件中寫(xiě)如下序列化類繼承自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)行在集群上,這里不寫(xiě)也可以。
編寫(xiě)視圖類:
from users.serializers import MyTokenObtainPairSerializer class MyTokenObtainPairView(TokenObtainPairView): serializer_class = MyTokenObtainPairSerializer
編寫(xiě)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/refresh
url,參數(shù)就是refresh的值。 - access:這個(gè)就是token但是框架里叫做access。
- token:這個(gè)是在序列化文件中給access新命名了一個(gè)值,方便前端獲?。?/li>
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
- 重寫(xiě)
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使用正則匹配實(shí)現(xiàn)抓圖代碼分享
本文給大家分享的是個(gè)人的第一個(gè)作品,使用Python正則匹配實(shí)現(xiàn)抓圖代碼,非常的簡(jiǎn)單實(shí)用,推薦給大家,小伙伴們可以自由擴(kuò)展下。2015-04-04用Python的Tornado框架結(jié)合memcached頁(yè)面改善博客性能
這篇文章主要介紹了用Python的Tornado框架結(jié)合memcached頁(yè)面改善vLog性能,主要使用到了緩存來(lái)提升性能,需要的朋友可以參考下2015-04-04Python局部函數(shù)及用法詳解(含nonlocal關(guān)鍵字)
局部函數(shù)有哪些特征,在使用時(shí)需要注意什么呢?接下來(lái)就給讀者詳細(xì)介紹?Python?局部函數(shù)的用法,對(duì)Python局部函數(shù)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2022-12-12python繪制評(píng)估優(yōu)化算法性能的測(cè)試函數(shù)
這篇文章主要為大家詳細(xì)介紹了python繪制評(píng)估優(yōu)化算法性能的測(cè)試函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06Python多線程編程threading模塊使用最佳實(shí)踐及常見(jiàn)問(wèn)題解析
這篇文章主要為大家介紹了Python多線程編程threading模塊使用最佳實(shí)踐及常見(jiàn)問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python進(jìn)階之如何快速將變量插入有序數(shù)組
在我們學(xué)習(xí)python的過(guò)程中,學(xué)習(xí)序列是一門(mén)必修課。本文我們就來(lái)一起看一看Python是如何快速將變量插入有序數(shù)組的,感興趣的可以了解一下2023-04-04