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