drf 自定义认证

  1 # models.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 
 22 # url.py
 23 from django.contrib import admin
 24 from django.urls import path, re_path, include
 25 from rest_framework.routers import SimpleRouter
 26 
 27 from app01 import views
 28 
 29 router = SimpleRouter()
 30 router.register('', views.BookView, 'get1')
 31 
 32 urlpatterns = [
 33     path('admin/', admin.site.urls),
 34 
 35     # path('get1/', views.BookView.as_view(actions={'get': 'list', 'post': 'create'})),
 36     # re_path(r'get1/(?P<pk>\d)',
 37     #         views.BookView.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
 38     path('login/', views.LoginView.as_view()),
 39     path('', include(router.urls)),
 40 
 41 ]
 42 
 43 # view.py
 44 import uuid
 45 from django.shortcuts import render
 46 from rest_framework.views import APIView
 47 from rest_framework.response import Response
 48 from rest_framework.decorators import action
 49 from rest_framework.viewsets import ModelViewSet
 50 from rest_framework.generics import GenericAPIView
 51 
 52 from . import models
 53 from . import serializer
 54 from .authontionscate import comm_authentication
 55 
 56 
 57 # 图书返回接口
 58 class BookView(ModelViewSet):
 59     authentication_classes = [comm_authentication]
 60     queryset = models.Book.objects.all()
 61     serializer_class = serializer.ModelViewSetSerializer
 62 
 63     @action(methods=['GET', 'POST'], detail=False)
 64     def get1(self, request):
 65         book = self.get_queryset()[0:2]
 66         book_serializer = self.get_serializer(book, many=True)
 67         return Response({'code': 100, 'msg': '成功', 'data': book_serializer.data})
 68 
 69 
 70 # 登录接口
 71 class LoginView(APIView):
 72     def post(self, request):
 73         username = request.data.get('username')
 74         password = request.data.get('password')
 75         user = models.User.objects.filter(username=username, password=password).first()
 76         if user:
 77             token = uuid.uuid4()
 78             models.UserToken.objects.update_or_create(defaults={'token': token}, user=user)
 79             return Response({'code': 100, 'msg': '成功', 'token': token})
 80         else:
 81             return Response({'code': 101, 'msg': '失败,账号错误或密码错误'})
 82 
 83 # serializer.py
 84 from rest_framework import serializers
 85 from . import models
 86 
 87 
 88 class ModelViewSetSerializer(serializers.ModelSerializer):
 89     class Meta:
 90         model = models.Book
 91         fields = '__all__'
 92 from rest_framework.authentication import BaseAuthentication
 93 
 94 from rest_framework.exceptions import AuthenticationFailed
 95 
 96 from . import models
 97 
 98 # authontionscate.py
 99 class comm_authentication(BaseAuthentication):
100     def authenticate(self, request):
101         # token 放的位置由后端决定
102         token = request.GET.get('token')
103         if token:
104             token_user = models.UserToken.objects.filter(token=token).first()
105             if token_user:
106                 return token_user.user, token
107             # else:
108             #     AuthenticationFailed({'code': 101, 'msg': '你没有权限'})
109             else:
110                 raise AuthenticationFailed('token认证失败')
111         else:
112             raise AuthenticationFailed('token没有')
113   
114   

 

posted @ 2021-05-22 23:16  mofr  阅读(82)  评论(0)    收藏  举报