认证+权限+频率(内置)(自定义)


 1 # permission.py 
 2 from rest_framework.permissions import BasePermission
 3 
 4 
 5 class comm_BasePermission(BasePermission):
 6     def has_permission(self, request, view):
 7         user = request.user
 8         print(user.get_user_type_display())
 9         print(user.username)
10         # if user.user_type == 1 or 2:
11         if user.user_type == 1:
12             return True
13         else:
14             return False

 

 # authontionscate.py
1
from rest_framework.authentication import BaseAuthentication 2 3 from rest_framework.exceptions import AuthenticationFailed 4 5 from . import models 6 7 8 class comm_authentication(BaseAuthentication): 9 def authenticate(self, request): 10 # token 放的位置由后端决定 11 token = request.GET.get('token') 12 # token = reques 13 if token: 14 token_user = models.UserToken.objects.filter(token=token).first() 15 if token_user: 16 return token_user.user, token 17 # else: 18 # AuthenticationFailed({'code': 101, 'msg': '你没有权限'}) 19 else: 20 raise AuthenticationFailed('token认证失败') 21 else: 22 raise AuthenticationFailed('token没有')

 


1
# model.py 2 from django.db import models 3 4 5 class Book(models.Model): 6 title = models.CharField(max_length=64) 7 author = models.CharField(max_length=225) 8 price = models.CharField(max_length=64) 9 10 11 class User(models.Model): 12 username = models.CharField(max_length=16) 13 password = models.CharField(max_length=32) 14 user_type = models.IntegerField(choices=((1, 'vip'), (2, 'comm'), (3, '2b'))) 15 16 17 class UserToken(models.Model): 18 token = models.CharField(max_length=64) 19 user = models.OneToOneField(to='User', on_delete=models.DO_NOTHING) 20 21 # urls.py 22 from django.contrib import admin 23 from django.urls import path, re_path, include 24 from rest_framework.routers import SimpleRouter 25 26 from app01 import views 27 28 router = SimpleRouter() 29 router.register('', views.BookView, 'get1') 30 31 urlpatterns = [ 32 path('admin/', admin.site.urls), 33 path('login/', views.LoginView.as_view()), 34 path('', include(router.urls)), 35 36 ] 37 38 # views.py 39 import uuid 40 from django.shortcuts import render 41 from rest_framework.views import APIView 42 from rest_framework.response import Response 43 from rest_framework.decorators import action 44 from rest_framework.viewsets import ModelViewSet 45 from rest_framework.generics import GenericAPIView 46 47 from rest_framework.authentication import SessionAuthentication 48 from rest_framework.permissions import IsAdminUser 49 from rest_framework.throttling import AnonRateThrottle, UserRateThrottle 50 51 from . import models 52 from . import serializer 53 from .authontionscate import comm_authentication 54 from .permission import comm_BasePermission 55 56 ''' 57 1.认证配合权限(自定义)局部 58 2.认证配合权限(内置)全局 59 3.认证+频率(内置)---未登录的用户 登录的用户 进行限制 60 4.认证+权限+频率(内置) 61 ''' 62 63 64 # 1.认证配合权限(自定义)局部 65 # 图书返回接口 66 # class BookView(ModelViewSet): 67 # authentication_classes = [comm_authentication] 68 # permission_classes = [comm_BasePermission] 69 # queryset = models.Book.objects.all() 70 # serializer_class = serializer.ModelViewSetSerializer 71 # 72 # @action(methods=['GET', 'POST'], detail=False) 73 # def get1(self, request): 74 # book = self.get_queryset()[0:2] 75 # book_serializer = self.get_serializer(book, many=True) 76 # return Response({'code': 100, 'msg': '成功', 'data': book_serializer.data}) 77 # 78 # 79 # # 登录接口 80 # class LoginView(APIView): 81 # def post(self, request): 82 # username = request.data.get('username') 83 # password = request.data.get('password') 84 # user = models.User.objects.filter(username=username, password=password).first() 85 # if user: 86 # token = uuid.uuid4() 87 # models.UserToken.objects.update_or_create(defaults={'token': token}, user=user) 88 # return Response({'code': 100, 'msg': '成功', 'token': token}) 89 # else: 90 # return Response({'code': 101, 'msg': '失败,账号错误或密码错误'}) 91 92 93 # 2.认证配合权限(内置)全局 94 # class BookView(ModelViewSet): 95 # queryset = models.Book.objects.all() 96 # serializer_class = serializer.ModelViewSetSerializer 97 # 98 # @action(methods=['GET', 'POST'], detail=False) 99 # def get1(self, request): 100 # book = self.get_queryset()[0:2] 101 # book_serializer = self.get_serializer(book, many=True) 102 # return Response({'code': 100, 'msg': '成功', 'data': book_serializer.data}) 103 # 104 # 105 # # 登录接口 106 # class LoginView(APIView): 107 # authentication_classes = [] 108 # permission_classes = [] 109 # 110 # def post(self, request): 111 # username = request.data.get('username') 112 # password = request.data.get('password') 113 # user = models.User.objects.filter(username=username, password=password).first() 114 # if user: 115 # token = uuid.uuid4() 116 # models.UserToken.objects.update_or_create(defaults={'token': token}, user=user) 117 # return Response({'code': 100, 'msg': '成功', 'token': token}) 118 # else: 119 # return Response({'code': 101, 'msg': '失败,账号错误或密码错误'}) 120 121 122 # # 3.认证+频率(内置)--- 未登录的用户 登录的用户 进行限制 123 # class BookView(ModelViewSet): 124 # queryset = models.Book.objects.all() 125 # serializer_class = serializer.ModelViewSetSerializer 126 # 127 # @action(methods=['GET', 'POST'], detail=False) 128 # def get1(self, request): 129 # book = self.get_queryset()[0:2] 130 # book_serializer = self.get_serializer(book, many=True) 131 # return Response({'code': 100, 'msg': '成功', 'data': book_serializer.data}) 132 # 133 # 134 # # 登录接口 135 # class LoginView(APIView): 136 # authentication_classes = [] 137 # permission_classes = [] 138 # 139 # def post(self, request): 140 # username = request.data.get('username') 141 # password = request.data.get('password') 142 # user = models.User.objects.filter(username=username, password=password).first() 143 # if user: 144 # token = uuid.uuid4() 145 # models.UserToken.objects.update_or_create(defaults={'token': token}, user=user) 146 # return Response({'code': 100, 'msg': '成功', 'token': token}) 147 # else: 148 # return Response({'code': 101, 'msg': '失败,账号错误或密码错误'}) 149 150 151 # 4.认证+权限+频率(内置) 152 class BookView(ModelViewSet): 153 authentication_classes = [SessionAuthentication] 154 permission_classes = [IsAdminUser] 155 throttle_classes = [AnonRateThrottle, UserRateThrottle] 156 queryset = models.Book.objects.all() 157 serializer_class = serializer.ModelViewSetSerializer 158 159 @action(methods=['GET', 'POST'], detail=False) 160 def get1(self, request): 161 book = self.get_queryset()[0:2] 162 book_serializer = self.get_serializer(book, many=True) 163 return Response({'code': 100, 'msg': '成功', 'data': book_serializer.data}) 164 165 166 # 登录接口 167 class LoginView(APIView): 168 authentication_classes = [] 169 permission_classes = [] 170 171 def post(self, request): 172 username = request.data.get('username') 173 password = request.data.get('password') 174 user = models.User.objects.filter(username=username, password=password).first() 175 if user: 176 token = uuid.uuid4() 177 models.UserToken.objects.update_or_create(defaults={'token': token}, user=user) 178 return Response({'code': 100, 'msg': '成功', 'token': token}) 179 else: 180 return Response({'code': 101, 'msg': '失败,账号错误或密码错误'}) 181 182 # serializer.py 183 from rest_framework import serializers 184 from . import models 185 186 187 class ModelViewSetSerializer(serializers.ModelSerializer): 188 class Meta: 189 model = models.Book 190 fields = '__all__' 191 192 # settings.py 193 194 REST_FRAMEWORK = { 195 # 2.内置登录认证 196 'DEFAULT_AUTHENTICATION_CLASSES': [ 197 'rest_framework.authentication.SessionAuthentication', 198 ], 199 # 2.内置权限 200 'DEFAULT_PERMISSION_CLASSES': [ 201 'rest_framework.permissions.IsAdminUser', 202 ], 203 # 3.内置频率--未登录限制 204 'DEFAULT_THROTTLE_CLASSES': ( 205 'rest_framework.throttling.AnonRateThrottle', 206 ), 207 'DEFAULT_THROTTLE_RATES': { 208 'anon': '3/m', 209 }, 210 # 3.登录与未登录限制 211 'DEFAULT_THROTTLE_CLASSES': ( 212 'rest_framework.throttling.AnonRateThrottle', 213 'rest_framework.throttling.UserRateThrottle' # 登录频率 214 ), 215 'DEFAULT_THROTTLE_RATES': { 216 'user': '5/m', 217 'anon': '3/m', 218 }, 219 # 4. 局部 220 'DEFAULT_THROTTLE_RATES': { 221 'user': '5/m', 222 'anon': '3/m', 223 } 224 }

 

posted @ 2021-05-23 15:51  mofr  阅读(63)  评论(0)    收藏  举报