目录
认证权限频率
在APIView执行的过程中,在dispatch方法中走了三大认证
self.initial(request, *args, **kwargs)
def initial(self, request, *args, **kwargs):
···
self.perform_authentication(request) # 认证
self.check_permissions(request) # 权限
self.check_throttles(request) # 频率
-
认证
- 需求
前后端混合开发,可以通过HttpResponse对象来设置cookie进而校验登录,现在前后端分离开发,用不到cookie,我们通过登录接口,来模拟认证登录,登录成功返回json字符串,并且携带随机字符串(uuid模拟生成token),通过token随机字符串来判断用户是否登录,登录了就更新token,首次登录就存token;
- 分析
- 创建User表
- 创建UserToken表,和User一对一关系
- 前端传入用户名,密码
- 数据库取校验用户信息
- 校验成功,Token表内新增一条记录,返回给前端json格式字符串,字符串中带一个随机字符串
-
登录认证
- 模型层
from django.db import models class User(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=16) user_type = models.IntegerField(choices=((1, '超级管理员'), (2, '普通管理员'), (3, '普通用户'))) def get_code(self): self.get_user_type_display() print(self.get_user_type_display()) class UserToken(models.Model): user = models.OneToOneField(to=User,on_delete=models.CASCADE) token = models.CharField(max_length=32)
- 视图层
from rest_framework.response import Response from rest_framework.viewsets import ViewSet from rest_framework.decorators import action from app01 import models class UserView(ViewSet): @action(methods=['POST'], detail=False) def login(self, request, *args, **kwargs): # 获取数据 username = request.data.get('username') password = request.data.get('password') user = models.User.objects.filter(username=username, password=password).first() if user: # 如果user有值说明登录成功,生产随机字符串,存入数据库,如果重复登录那么就更新随机字符串 import uuid uuid_str = uuid.uuid4() # print(type(uuid_str)) # <class 'uuid.UUID'> token = str(uuid_str) # 如果存在就更新,如果不存在就新增,指定搜索对象,然后defaults指定更新内容 models.UserToken.objects.update_or_create(user=user,defaults={'token': token} ) # 返回随机字符串 return Response({'code': 100, 'msg': '登录成功', 'token': token}) return Response({'code': 101, 'msg': '登录失败,用户名或密码错误'})
- 路由
from django.contrib import admin from django.urls import path,include from app01 import views from rest_framework.routers import SimpleRouter router = SimpleRouter() router.register('user',views.UserView,'user') urlpatterns = [ path('admin/', admin.site.urls), path('',include(router.urls)) ]
- 模型层
- 需求
-
权限
-
频率