首页 > 其他分享 >drf之登录功能,认证组件,权限组件,频率组件

drf之登录功能,认证组件,权限组件,频率组件

时间:2023-05-24 21:13:44浏览次数:39  
标签:登录 models request token user 组件 import 权限 drf

目录

一、登录功能

image

表模型

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)


class UserToken(models.Model):
    token = models.CharField(max_length=64)
    user = models.OneToOneField(to=UserInfo, on_delete=models.CASCADE)

视图类

#### 登录接口
from rest_framework.views import APIView
from .models import *
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
import uuid
class UserView(ViewSet):


    def login(self,request):
        username = request.data.get('name')
        password = request.data.get('password')
        user = UserInfo.objects.filter(name=username, password=password).first()
        if user:
            token = str(uuid.uuid4())
            # 复杂写法
            # res = UserToken.objects.filter(user_id=user.id)
            # if res:
            #     UserToken.objects.update(token=token)
            #     return Response({'code': 100, 'msg': '登录成功', 'token': token})
            # else:
            #     UserToken.objects.create(user_id=user.id,token=token)
            #     return Response({'code':100, 'msg': '登录成功', 'token': token})
            # 把token存到表中,UserToken表有值就更新,没有值就新增
            UserToken.objects.update_or_create(user=user, defaults={'token':token})
            return Response(({'code':100, 'msg': '登录成功', 'token': token}))
        else:
            return Response({'code': 101, 'msg': '用户名或密码错误'})

回顾

	UserToken表中有user字段
    拿到了一个UserToken表的对象  
    	user_token.token 就是字符串
        user_token.user  基于对象的跨表查询,拿到的是user对象  user_token.user.password
        user_token.user_id  隐藏了这个字段,是可以用的,它是管理的user对象的id号
    查询功能
     UserToken.objects.filter(user=user对象)
     UserToken.objects.filter(user_id=user.id)

路由

from django.contrib import admin
from django.urls import path
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('login/', views.UserView.as_view({'post':'login'}))
]

urlpatterns += router.urls

postman
image

二、认证组件

APIView执行流程
-在视图视图类的方法之前,执行了三大认证
-认证

认证:登录认证
-登录认证---》控制,某个接口必须登录后才能访问

认证组件使用步骤(固定用法)

  1. 新建一个auth文件,写一个类,继承BaseAuthentication
  2. 在类中写:authenticate
  3. 在方法中,完成登录认证,如果 不是登录的,抛异常
  4. 如果是登录的,返回登录用户和token
from rest_framework.authentication import BaseAuthentication
from .models import UserToken
from rest_framework.exceptions import AuthenticationFailed


class LoginAuth(BaseAuthentication):
    def authenticate(self, request):  # 父类中有,一定要重写
        # 校验用户是否登录---》请求中携带我给的token,就是登录了
        # token在哪携带,是接口规定的---》
        # 1 规定带在请求地址中---》讲这个
        # 2 规定带在请求头中(这个多)
        # 3 规定待在请求体中

        # 取出token    META     HTTP_TOKEN
        token = request.query_params.get('token')
        # 去数据库中,根据token,校验有没有数据
        user_token = UserToken.objects.filter(token=token).first()
        if user_token:
            user = user_token.user  # 当前登录用户就是user
            return user, token
        else:
            # 说明它带的token不对的
            raise AuthenticationFailed('您没有登录,不能访问')
  1. 在视图类中,使用认证类(局部使用)
    class BookView(APIView):
    	authentication_classes = [LoginAuth, ] 
  1. 全局使用:
    # 全局使用
    ### 重点:不要在配置文件中,导入莫名其妙的包
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'app01.auth.LoginAuth'
        ],

    }
  1. 全局使用后,局部禁用
    image
    class UserView(ViewSet):
        # 局部禁用
        authentication_classes = []
  1. 认证类的使用顺序
  •   -优先用视图类配置的
    
  •     -其次用项目配置文件
    
  •     -最后用drf默认的配置
    

重点;一旦通过认证,在request中就有当前登录用户

    def get(self, request):
        # 一旦通过认证,在request中就有当前登录用户
        print(request.user.name,'访问了接口')

先登录
image
然后再拿token去查books
image

三、权限组件

大家都登录了,但有的功能(接口),只有超级管理员能做,有的功能所有登录用户都能做----》这就涉及到权限的设计了

ps:权限设计:比较复杂---》有acl,rbac,abac。。。

咱们现在只是为了先讲明白,drf的权限组件如何用,咱们先以最简单的为例

-查询所有图书:所有登录用户都能访问(普通用户和超级管理员)
	-其实没有权限控制
-删除图书,只有超级管理员能访问
	-给其它用户设置的权限

在modles中用户表加一个字段判断是否为超级管理员

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    user_type = models.IntegerField(choices=((1, '超级管理员'), (2, '普通登录用户'), (3, '2B用户')),default=3)

权限类的使用步骤

1 建一个permission文件夹,写一个类,继承BasePermission
2 在类中写方法:has_permission
-如果有权限,就返回True
-如果没有权限,就返回False
-错误信息是self.message='字符串'

from rest_framework.permissions import BasePermission

class AdminPermission(BasePermission):
    def has_permission(self, request, view):
        # 如果有权限,就是返回True,没有权限,返回False
        # 判断user_type是不是 1,根据当前登录用户
        # request.user  # 就是当前登录用户,一旦来到这里,认证就通过了
        if request.user.user_type == 1:  # 一定要注意类型#####
            return True
        else:
            # 错误信息
            self.message = '您好:%s,您没有权限' % request.user.name
            return False

image

3 局部使用

    class BookDetailView(APIView):
        permission_classes = [AdminPermission, ]

4 全局使用

        REST_FRAMEWORK = {
        'DEFAULT_PERMISSION_CLASSES': [
            'app01.permission.AdminPermission'
        ],
        }

5 局部禁用

    class BookView(APIView):
    	permission_classes = []

四、频率组件

限制访问频次
-比如某个接口,一分钟只能访问5次,超过了就得等
-按IP地址 限制
-按用户id 限制

频率类的使用步骤

1 新建一个throttling文件,写个类,继承:SimpleRateThrottle
2 重写某个方法:get_cache_key
-可以返回ip或用户id
-返回什么,就以什么做频率限制

3 写一个类属性,随意命名一个名

	scope = 'lqz'
from rest_framework.throttling import SimpleRateThrottle

class ThreeThrottle(SimpleRateThrottle):
    scope = 'iu'
    def get_cache_key(self, request, view):
        ip = request.META.get('REMOTE_ADDR')
        print('客户端的IP是:',ip)
        return ip

4 在配置文件中配置:

 'DEFAULT_THROTTLE_RATES': {
    'lqz': '3/m' # 一分钟访问3次
},

5 全局用

'DEFAULT_THROTTLE_CLASSES': [

    ],

6 局部用

class BookView(APIView):
    throttle_classes = [MyThrottle]

标签:登录,models,request,token,user,组件,import,权限,drf
From: https://www.cnblogs.com/yuezongke/p/17429248.html

相关文章

  • drf与视图类
    drf与视图类模块与包的使用#模块与包 模块:一个py文件,被别的py文件导入使用就是模块,直接右键运行就是脚本文件包:一个文件夹里面有__init__.py文件#模块与包的导入问题 '''导入模块有相对导入和绝对导入,绝对的路径是从环境变量开始的导入任何模块,如果使用绝......
  • django配置文件作用,drf 登录功能,drf认证组件,drf权限组件,drf频率组件
    django配置文件作用:    drf登录功能:view内:from.modelsimportUserInfo,UserTokenfromrest_framework.viewsetsimportViewSetimportuuidfromrest_framework.responseimportResponsefromrest_framework.decoratorsimportactionclassUser......
  • jmeter--定时器组件
    工作中,用jmeter写接口测试脚本、性能测试脚本时,通常也会用到定时器组件,一般用的比较多的还是固定定时器、同步定时器。对于其他的定时器了解的不是特别深,为了更系统更深入的学习jmeter工具和工具中的定时器组件,自己对一些经常使用的定时器组件进行了学习、探索,并记录了一些知识点......
  • Java Web三大组件之Filter过滤器
    JavaWeb三大组件(Servlet、Filter、Listener)1、Filter过滤器概念生活中的过滤器:净水器,空气净化器,大山里的土匪等JavaWeb中的过滤器:当浏览器访问服务器资源时,过滤器就会拦截浏览器发过来的请求,实现一些特别的功能作用:一般用于完成通用的操作,如登录验证,身份验证,统一字符编码和敏感字......
  • 同步mysql数据库binlog用户所需要权限
    同步mysqlbinlog用户读写权限报错提示doesnothaveREPLICATION_CLENTprivilege 使用场景:常用于阿里云flink同步数据库binlog使用解决方案:fiink cdc 的表用户,需要有Replicationclient,Replicationslave权限。授权命令如下:grantReplicationclienton*.* toods_base@......
  • 权限
    '''权限类使用1写一个类,继承BasePermission2在类中写方法:has_permission1如果有权限,返回Trueifrequest.user.is_super==1:returnTrue2如果没有权限,返回FalsereturnFalse3错误信息是self.message=""self.message=""......
  • drf频率的使用
    频率,按ip地址,用户id,限制1写一个类,继承SimpleRateThrottle2写一个方法,get_cache_key-可以返回ip或者用户idreturnrequest.META.get("REMOTE_ADDR")-返回什么,就用什么做频率限制3写一个类属性scope='lqz'4在配置文件中配置'DEFAULT_THROTTLE_RATES':{......
  • 记录--按钮级别权限怎么控制
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助最近的面试中有一个面试官问我按钮级别的权限怎么控制,我说直接v-if啊,他说不够好,我说我们项目中按钮级别的权限控制情况不多,所以v-if就够了,他说不够通用,最后他对我的评价是做过很多东西,但是都不够深入,好吧,那今天我们......
  • vs2019打包程序时添加自定义的系统必备组件
     若要创建引导程序包,必须创建产品清单产品清单 product.xml包清单 package.xml 将文件复制到引导程序文件夹位置C:\ProgramFiles(x86)\MicrosoftVisualStudio14.0\SDK\Bootstrapper\Packages文件夹下    ......
  • vue2实现高度过渡效果,函数式组件
    1.首先创建src下创建utils文件夹,创建transition.js文件封装过渡组件consttransitionStyle='0.3sheightease-in-out'constTransition={//进入前设置el元素的transition,高度0beforeEnter(el){el.style.transition=transitionStyleel.style.height......