认证组件

  很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任何数据,有客户端请求,我即返回数据,简单方便,每一个http请求都是新的,响应之后立即断开连接。而现在不同,现在的时代已经不能没有用户了,所以随之而来的就是用户交互,之前对于用户认证的我们cookies和secess都可以,但是相对于我们今天学的token而言,市面上还是说token用的比较多一点,所以,token!!!你们懂了吧,嘿嘿好了,废话不说了直接上干货

  1.创建表

  

model.py

from django.db import models

# Create your models here.

class User(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
user_type_entry = (
(1, 'Delux'),
(2, 'SVIP'),
(3, "VVIP")
)
user_type = models.IntegerField(choices=user_type_entry)
address = models.CharField(max_length=32) def __str__(self):
return self.username class UserToken(models.Model):
user = models.OneToOneField("User", on_delete=models.CASCADE)
token = models.CharField(max_length=128)

2.urls

re_path(r'user/$', views.UserView.as_view()),

  

3.涉及用户交互的行为只有post请求的时候才会有,所以我们只需要写post请求就可以了,get请求我们不必写

views.py

from django.http import JsonResponse

from rest_framework.views import APIView

from .models import User, Book, UserToken
from .utils import get_token class UserView(APIView): def post(self, request):
response = dict()
try:
#因为所有的数据都在request.data中,所以我们取得时候就直接在data中取
username = request.data['username']
password = request.data['password'] user_instance = User.objects.filter(
user_name=username,
password=password
).first() #get_token.generater_token() 这里使我们随机产生的token值,我们需要在下一步中引用一下
if user_instance:
access_token = get_token.generater_token() UserToken.objects.update_or_create(user=user_instance, defaults={
"token": access_token
})
response["status_code"] = 200
response["status_message"] = "登录成功"
response["access_token"] = access_token
response["user_role"] = user_instance.get_user_type_display()
else:
response["status_code"] = 201
response["status_message"] = "登录失败,用户名或密码错误"
except Exception as e:
response["status_code"] = 202
response["status_message"] = str(e) return JsonResponse(response)

4.新建utils文件夹

import uuid

def generater_token():
random_str = ''.join(str(uuid.uuid4()).split('-'))
return random_str

5.完美,现在一个简单的token就已经创建完了,下面,开始我们认证组建的使用

6.第一步:新建一个认证类

from rest_framwork.authentication import BaseAuthentication
from rest_framwork.exceptions import APIException #. 代表往上走一层,或者你可以直接写你自己的当前程序
from .model import UserToken
views.py

#权限类
class UserPerm():
message = "您没有查看该数据的权限!" def has_permission(self, request, view):
#这里的3就是我们新建表中的数据
if request.user.user_type == 3:
return True
return False class BookView(ModelViewSet):
#指定认证类
authentication_class = [UserAuth]
#指定权限类
permission_classes= [UserPerm] #序列化
queryset = Book.objects.all()
serializer_class = BookSerializer

class UserAuth(BaseAuthentication):

#这里注意,认证类中必须有authenticate这个方法!!!为啥?看源码
def authenticate(self,request):
user_token = request.query_params.get('token')
#一定要记得try
try:
token = UserToken.objects.get(token = user_token)
return token.user,token.token
except Exception as e:
raise APIException('没有认证')

频率组件

1.写频率类

from rest_framework.throttling import SimpleRateThrottle

#必须继承SimpleRateThrottle这个类
class RateThrottle(SimpleRateThrottle):
rate = '5/m' def get_cache_key(self, request, view):
#这里是通过id来控制访问的频率
return self.get_ident(request)

2.指定频率类

from .utils.throttles import RateThrottle

# Create your views here.

class BookView(ModelViewSet):
throttle_classes = [ RateThrottle ]
queryset = Book.objects.all()
serializer_class = BookSerializer

3.用!!!

 好了。现在我们的基本就实现了,后期还会有补充哦

参考网址;https://pizzali.github.io/2018/12/07/DRF%E4%B9%8B%E6%9D%83%E9%99%90%E8%AE%A4%E8%AF%81%E9%A2%91%E7%8E%87%E7%BB%84%E4%BB%B6/

  

DRF之权限认证频率组建的更多相关文章

  1. DRF之权限认证频率组件

    概要 retrieve方法源码剖析 认证组件的使用方式及源码剖析 权限组件的使用方式及源码剖析 频率组件的使用方式及源码剖析 知识点复习回顾 Python逻辑运算 知识点复习回顾一:Python逻辑运 ...

  2. DRF的权限和频率

    DRF的权限 权限组件源码 权限和频率以及版本认证都是在initial方法里初始化的 我们的权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~ 在rest ...

  3. DRF之权限认证,过滤分页,异常处理

    1. 认证Authentication 在配置文件中配置全局默认的认证方案 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_f ...

  4. DRF之权限和频率限制

    一.权限 权限可以限制用户对视图的访问和对具体数据对象的访问. 在执行视图的dispatch方法前,会先进行视图访问权限的判断 在通过get_object获取对象时,会进行模型对象访问权限的判断 源码 ...

  5. drf框架 - 三大认证组件 | 认证组件 | 权限组件 | 频率组件

    RBAC 基于用户权限访问控制的认证 - Role-Based Access Control Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为 三表规则.五表规则,Django采用 ...

  6. DRF 认证 权限 视图 频率

    认证组件 使用:写一个认证类,继承BaseAuthentication 在类中写authenticate方法,把request对象传入 能从request对象中取出用户携带的token根据token判 ...

  7. DRF 权限和频率

    Django Rest Framework 权限组件 DRF的权限 权限组件源码解析 我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其实我们版本 ...

  8. rest-framework框架——认证、权限、频率组件

    一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...

  9. DRF 版本、认证、权限、限制、解析器和渲染器

    目录 一.DRF之版本控制 为什么要有版本控制? DRF提供的版本控制方案 版本的使用 全局配置 局部配置(使用较少) 二.DRF之认证 内置的认证 步骤 三.DRF之权限 1.自定义一个权限类 2. ...

随机推荐

  1. 《网络攻防》 第十二周作业 SQL注入

    SQL注入实践 1.打开seed虚拟机,使用命令sudo service apache2 start启动apache,发现一条提示,意思就是不能可靠地确定域名,如图 即使右下角标着OK,但我还是不放心 ...

  2. Cookie seesion 赋值

    后台赋值: Session["uid"] = userid;//后台 后台取值: Label1.Text = Session["userid"].ToStrin ...

  3. iOS状态栏、导航栏的设置

    简单的参考 1.状态栏(statusBar) 默认:黑色 改变为白色: 1.1 第一步: info.plist中添加View controller-based status bar appearanc ...

  4. <c:choose>标签内出错。不能写注解,否则就会报错

    org.apache.jasper.JasperException: Validation error messages from TagLibraryValidator for c in /WEB- ...

  5. [SinGuLaRiTy] 分治题目复习

    [SInGuLaRiTy-1025] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. [POJ 1905] 棍的膨胀 (Expanding ...

  6. phaser小游戏框架学习(二)

    今天继续学习phaser.js.上周写的学习教程主要内容是创建游戏场景,游戏中的显示对象,按钮对象的使用以及如何在不同屏幕大小中完美适配.这篇博客以介绍游戏榜单的渲染更新为主. 代码地址:https: ...

  7. git 本地分支与远程分支相关操作记录

    1.远程分支中有新增分支,但自己的本地分支没有对应同步 git checkout -b [remote-branch-name] origin/[remote-branch-name] 2. 查看本地 ...

  8. HTTP Status 500 - org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

    HTTP Status 500 - org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.e ...

  9. springcloud系列六 整合security

    一 Eureka注册中心认证: Eureka自带了一个管理界面,如果不加密,所有人都可以进行访问这个地址,这样安全问题就来了,所以需要对其进行加密认证: 那么该如何进行整合呢: 1 在注册中心模块添加 ...

  10. element el-tree循环遍历树形结构,并动态赋值disabled属性

    凌晨3点,功夫不负有心人,已经累趴,效果终于出来: 贴上代码: <style scoped> .form { width: 50%; } </style> <templa ...