首页 > 其他分享 >DRF高阶

DRF高阶

时间:2022-11-01 22:58:17浏览次数:59  
标签:登录 models self token user import 高阶 DRF

目录

认证权限频率

在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))
        ]
        
  • 权限

  • 频率

标签:登录,models,self,token,user,import,高阶,DRF
From: https://www.cnblogs.com/al6nlee/p/16849455.html

相关文章

  • drf-排序
    https://www.bilibili.com/video/BV1z64y197Dk?p=20&vd_source=caabcbd2a759a67e2a3de8acbaaf08eaviews.pyclassBookView(ModelViewSet):queryset=Book.objects.......
  • Django+drf项目创建
    1.创建虚拟环境condacreate-n虚拟环境名python=3.x 2.安装django版本的包pipinstalldjango==3.x.x 3.安装drf包pipinstalldjangorestframework 4.创建......
  • drf-分页器的使用
    -----全局配置分页器setting.pyREST_FRAMEWORK={#全局分页设置"DEFAULT_PAGINATION_CLASS":"rest_framework.pagination.PageNumberPagination","PAGE_SI......
  • React进阶篇——十二、继承方式实现高阶组件
    十二、继承方式实现高阶组件前面介绍的高阶组件的实现方式都是由高阶组件处理通用逻辑,然后将相关属性传递给被包装组件,我们称这种实现方式为属性代理。除了属性代理,还可以......
  • drf-认证组件
    views.pyfromrest_framework.responseimportResponsefromrest_framework.viewsimportAPIView#局部自定义认证逻辑classMyAutheentication(object):defau......
  • React进阶篇——十、高阶组件使用场景
    十、高阶组件使用场景操纵props在被包装组件接收props前,高阶组件可以先拦截到props,对props执行增加、删除或修改的操作,然后将处理后的props再传递给被包装组件,上一篇的......
  • DRF进阶
    目录DRF框架请求与响应DRF之Requestrequest常用方法配置请求数据格式配置处理顺序局部配置全局配置DRf之ResponseReponse常用参数局部配置全局配置DRF框架请求与响应......
  • drf--ViewSet -第二波 进阶版
    https://www.bilibili.com/video/BV1z5411D7BQ?p=19&vd_source=caabcbd2a759a67e2a3de8acbaaf08eaview.pyfromsers.modelsimportBookfromrest_frameworkimportse......
  • React组件设计模式-纯组件,函数组件,高阶组件
    一、组件(1)函数组件如果你想写的组件只包含一个render方法,并且不包含state,那么使用函数组件就会更简单。我们不需要定义一个继承于React.Component的类,我们可以定......
  • 你是如何使用React高阶组件的?
    HighOrderComponent(包装组件,后面简称HOC),是React开发中提高组件复用性的高级技巧。HOC并不是React的API,他是根据React的特性形成的一种开发模式。HOC具体上就是一个接受......