-
安装coreAPI
pip install coreapi
-
安装djangorestframework:
pip install djangorestframework
-
安装djangorestframework-simplejwt
pip install djangorestframework-simplejwt
现在前后端分离基本都是采用了Token/JWT的认证默认,由于djangorestframework-jwt的作者已经不更新了,所以最新版本的python、Django都不能使用了,万幸的是还有djangorestframework-simplejwt,并且支持最新版本。 我的安装环境:python(3.10) django(4.0.3)
-
项目setting.py配置
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', # 很重要 'rest_framework_simplejwt',# 很重要 'system', # 这只是我自己的一个APP而已。 ]
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', # 这个是全局采用的认证方式 ], 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema', # 这个是coreAPI使用的 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', # DRF的分页 'PAGE_SIZE': 10 # 每页的数据条数 }
SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(days=5), # token的过期时间,我这里设置的是五天。timedelta是从datetimen导入的,from datetimen import timedelta 'REFRESH_TOKEN_LIFETIME': timedelta(days=7), # 刷新认证的时间,七天。 'USER_ID_FIELD': 'id', 'USER_ID_CLAIM': 'user_code', 'ALGORITHM': 'HS256', 'SIGNING_KEY': SECRET_KEY, 'AUTH_HEADER_TYPES': ('Token',), }
-
app里面的views.py
from django.contrib.auth.models import User, Group from rest_framework import viewsets from rest_framework.permissions import IsAuthenticated from system.serializer import UserSerializer, GroupSerializer class UserViewSet(viewsets.ModelViewSet): """ 允许用户查看或编辑的API路径。 """ permission_classes = (IsAuthenticated, ) # 这个就是告诉REF该视图必须认证才能被访问 queryset = User.objects.all().order_by('-date_joined') serializer_class = UserSerializer class GroupViewSet(viewsets.ModelViewSet): """ 允许组查看或编辑的API路径。 """ queryset = Group.objects.all() serializer_class = GroupSerializer
-
app里面serializer.py
from django.contrib.auth.models import User, Group from rest_framework import serializers class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ('url', 'username', 'email', 'groups') class GroupSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Group fields = ('url', 'name')
-
项目的urls.py
from django.contrib import admin from django.urls import path, include from rest_framework.routers import DefaultRouter from rest_framework_simplejwt.views import TokenRefreshView, TokenVerifyView, TokenObtainPairView from system.views import UserViewSet, GroupViewSet from rest_framework.documentation import include_docs_urls router = DefaultRouter() router.register(r'users', UserViewSet) #记住这里不能写namebase,否则会报错,具体啥原因我也不知道。 router.register(r'groups', GroupViewSet) urlpatterns = [ path('', include(router.urls)), path('admin/', admin.site.urls), path('login/', TokenObtainPairView.as_view(), name='login'), # 这个就是获取token的 path('token/Refresh', TokenRefreshView.as_view(), name='token_refresh'), path('token/Verify', TokenVerifyView.as_view(), name='token_verify'), path('docs/', include_docs_urls(title="My API title")) # 是coreAPI的API文档路径,很酷的界面。 ] urlpatterns += router.urls
在这里需要注意一点就是,Django 4已经没有url的方法了,所以一定要注意哟。
-
请求得到Token演示
得到两个返回结果refresh与accress,refresh是用于token过期后刷新accress用的,accress就是我们请求时候携带的token值,那么为啥accress过期了要刷新呢,不直接重新请求accress呢?希望哪个大神可以解答一些,谢谢。
- Token验证请求示例
这里一定要注意请求头为Authorization 携带的为Token+空格+access的值。
- coreAPI界面
努力学习到老,可以预防老年痴呆。