认证、权限和限制

身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制。然后 权限 和 限制 组件决定是否拒绝这个请求。

简单来说就是:

认证确定了你是谁

权限确定你能不能访问某个接口

限制确定你访问某个接口的频率

认证

REST framework 提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案。

个人 敲码log:

1.

# Create your models here.
class UserInfo1(models.Model):
id = models.AutoField(primary_key=True) # 创建一个自增的主键字段
# 创建一个varchar(64)的唯一的不为空的字段
name = models.CharField(null=False, max_length=20)
pwd = models.CharField(max_length=32,default=123) class Token(models.Model):
user = models.OneToOneField("UserInfo1",on_delete=models.CASCADE)
token = models.CharField(max_length=128)

2.

# 我需要一个随机字符串
def get_random_str(user):
import hashlib, time
ctime = str(time.time())
# 封装bytes类型一个MD5的加密对象
md5 = hashlib.md5(bytes(user, encoding="utf8"))
# md5.update 是拼接的效果,随机生成md5值
md5.update(bytes(ctime, encoding="utf8"))
return md5.hexdigest() # 认证、权限和限制
class LoginModelView(APIView):
def post(self, request):
name = request.data.get("name")
pwd = request.data.get("pwd") user = models.UserInfo1.objects.filter(name=name, pwd=pwd).first()
res = {"state_code": 1000, "msg": None}
if user:
# 返回了一个usermd5 加密的字符串
random_str = get_random_str(user.name)
"""
当存在token时,则更新,不存在则创建,defaults: 是由 (field, value) 对组成的字典,用于更新对象。
返回一个由 (object, created)组成的元组,
object: 是一个创建的或者是被更新的对象,
created: 是一个标示是否创建了新的对象的布尔值。
"""
token = models.Token.objects.update_or_create(user=user, defaults={"token": random_str})
res["token"] = random_str
else:
res["state_code"] = 1001 # 错误状态码
res["msg"] = "用户名或者密码错误" import json
# 这是因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False:
# 如果你这样的话就能把中文转成json字符串,而不是 \u4e2d\u56fd
return Response(json.dumps(res,ensure_ascii=False))

Django update_or_create 分析

update_or_create(defaults=None, **kwargs)
defaults 的值不同则创建,相同则更新

Member.objects.update_or_create(defaults={'user':1}, others={'field1':1,'field2':1})
当存在user=1时,则更新,不存在则创建

update_or_create 用法:

update_or_create(defaults=None, **kwargs)

kwargs: 来更新对象或创建一个新的对象。

defaults: 是由 (field, value) 对组成的字典,用于更新对象。

返回一个由 (object, created)组成的元组,

object: 是一个创建的或者是被更新的对象,

created: 是一个标示是否创建了新的对象的布尔值。

update_or_create: 方法通过给出的kwarg

定义一个认证类(详情请看 源码分析)

好处:

1.他能判断你是否是当前登录用户,当你没有带认证码 向我后端发请求的时候我是不会给你数据的。

2.他每一次登录的认证都会改变。

局部视图认证

示例1:

class TokenAuth(object):
def authenticate(self, request):
# 取到 request里面的 token值
totken = request.GET.get("token")
token_obj = models.Token.objects.filter(token=totken).first()
if not token_obj:
# 抛认证字段的异常
raise exceptions.AuthenticationFailed("验证失败")
else:
return token_obj.user.name,token_obj.token def authenticate_header(self,request):
pass
# 多条数据
class BookView(APIView):
# 定义一个认证类
authentication_classes = [TokenAuth]

而没有定义 token类的依然可以访问。

全局级别认证

# 定义全局认证,所有视图都需要认证
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES" : ["app01.utils.TokenAuth"] }

from app01 import models
from rest_framework import exceptions class TokenAuth(object):
def authenticate(self, request):
# 取到 request里面的 token值
totken = request.GET.get("token")
token_obj = models.Token.objects.filter(token=totken).first()
if not token_obj:
# 抛认证字段的异常
raise exceptions.AuthenticationFailed("验证失败")
else:
return token_obj.user.name, token_obj.token def authenticate_header(self, request):
pass

权限

只有VIP用户才能看的内容。

from rest_framework.permissions import BasePermission
class SVIPPermission(BasePermission):
message="只有超级用户才能访问"
def has_permission(self,request,view):
username=request.user
user_type=User.objects.filter(name=username).first().user_type if user_type==3: return True # 通过权限认证
else:
return False
# 封装了3层
class AuthorDetaiView(viewsets.ModelViewSet):
permission_classes = [SVIPpermission,]
throttle_classes = [] # 限制某个ip 每分钟访问次数不能超过20次
# authentication_classes = [TokenAuth]
# queryset serializer 这两个方法一定要定义成这个不然取不到值
queryset = models.Author.objects.all()
serializer_class = AuthorModelSerializers

限制(频率组件)

# 自定义局部限制

import time

# 自定义限制
VISIT_RECORD = {}
class VisitRateThrottle(object):
def __init__(self):
self.history = None def allow_request(self, request, view): """
自定义频率限制60秒内只能访问三次
"""
# 获取用户IP
ip = request.META.get("REMOTE_ADDR")
# 获取当前时间戳
timestamp = time.time() # 如果当前访问ip没有在列表中 我就新建一个IP访问记录
if ip not in VISIT_RECORD:
VISIT_RECORD[ip] = [timestamp, ]
# 可以通过验证
return True # 如果列表中有值,我就取当当前ip地址 赋值给变量
history = VISIT_RECORD[ip]
self.history = history
# 在列表头部 插入一个时间戳
history.insert(0, timestamp)
# 如果列表有值,最先插入的值小于 当前值-60 ,tiemstamp是当前时间是在增加的
while history and history[-1] < timestamp - 60:
# pop 取出 最后一个条件成立的值
history.pop()
# 列表中的时间戳 大于3 就返回falsse,否则通过
if len(history) > 3:
return False
else:
return True def wait(self):
# 返回给前端还剩多少时间可以访问
timestamp = time.time()
# 求出还剩多少时间可以访问
return 60 - (timestamp - self.history[-1])
# 视图使用
from rest_framework.response import Response class AuthorModelView(viewsets.ModelViewSet):
authentication_classes = [TokenAuth, ]
permission_classes = [SVIPPermission, ]
throttle_classes = [VisitRateThrottle, ] # 限制某个IP每分钟访问次数不能超过20次
queryset = Author.objects.all()
serializer_class = AuthorModelSerializers
# 分页
# pagination_class = MyPageNumberPagination
# renderer_classes = []

# 全局使用

# 在settings.py中设置rest framework相关配置项
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.TokenAuth", ],
"DEFAULT_PERMISSION_CLASSES": ["app01.utils.SVIPPermission", ],
"DEFAULT_THROTTLE_CLASSES": ["app01.utils.MyThrottle", ],
}

二:内置频率类的使用

定义频率类,必须继承SimpleRateThrottle类:

from rest_framework.throttling import SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle):
# 必须配置scope参数 通过scope参数去settings中找频率限定的规则
scope = 'throttle'
# 必须定义 get_cache_key函数 返回用户标识的key 这里借用源码中BaseThrottle类(SimpleRateThrottle的父类)中的get_ident函数返回用户ip地址
def get_cache_key(self, request, view):
return self.get_ident(request)

局部使用:

视图函数中加上
throttle_classes = [VisitThrottle,]

全局使用:settings中配置

REST_FRAMEWORK={
'DEFAULT_THROTTLE_CLASSES':['utils.common.VisitThrottle'],
# 局部使用也要在settings中配置上 DEFAULT_THROTTLE_RATES 通过self.scope取频率规则 (一分钟访问3次)
'DEFAULT_THROTTLE_RATES':{'throttle':'3/m',}
}

设置错误信息为中文:

class Course(APIView):
authentication_classes = [TokenAuth, ]
permission_classes = [UserPermission, ]
throttle_classes = [MyThrottles,] def get(self, request):
return HttpResponse('get') def post(self, request):
return HttpResponse('post')
# 函数名为throttled 重写Throttled类中默认的错误信息
def throttled(self, request, wait):
from rest_framework.exceptions import Throttled
class MyThrottled(Throttled):
default_detail = '访问频繁'
extra_detail_singular = '等待 {wait} second.'
extra_detail_plural = '等待 {wait} seconds.'
raise MyThrottled(wait)

Django REST framework认证权限和限制和频率的更多相关文章

  1. Django REST Framework 认证 - 权限 - 限制

    一. 认证 (你是谁?) REST framework 提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案. 自定义Token认证 第一步 : 建表>>>> 定义一个 ...

  2. Django REST framework认证权限和限制 源码分析

    1.首先 我们进入这个initial()里面看下他内部是怎么实现的. 2.我们进入里面看到他实现了3个方法,一个认证,权限频率 3.我们首先看下认证组件发生了什么 权限: 啥都没返回,self.per ...

  3. Django Rest Framework(认证、权限、限制访问频率)

    阅读原文Django Rest Framework(认证.权限.限制访问频率) django_rest_framework doc django_redis cache doc

  4. Django Rest framework 之 权限

    django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...

  5. 04 Django REST Framework 认证、权限和限制

    目前,我们的API对谁可以编辑或删除代码段没有任何限制.我们希望有更高级的行为,以确保: 代码片段始终与创建者相关联. 只有通过身份验证的用户可以创建片段. 只有代码片段的创建者可以更新或删除它. 未 ...

  6. django 之(三) --- 认证|权限

    用户模块 登陆注册1:Django2.0  [ 1:N ] user/url.py from django.urls import path from user.views0 import UserT ...

  7. rest framework 认证 权限 频率

    认证组件 发生位置 APIview 类种的 dispatch 方法执行到 initial 方法 进行 认证组件认证 源码位置 rest_framework.authentication  源码内部需要 ...

  8. Django Rest Framework之权限

    基本代码结构 url.py: from django.conf.urls import url, include from app import views urlpatterns = [ url(r ...

  9. Django REST framework - 认证

    目录 认证 DRF 5种验证方式 如何确定身份验证? 设置身份验证方案 案例: 基于自定义Token认证 第一步: 定义一个用户表和一个保存用户Token的表 第二步: 定义一个登陆视图 第三步定义一 ...

随机推荐

  1. 21 javaweb开发--bug调试技巧

    1.当修改代码后,测试时没有任何效果 解决方案:换个浏览器试试,可能是浏览器缓存的原因.

  2. springboot2.1.8使用poi导出数据生成excel(.xlsx)文件

    前言:在实际开发中经常需要将数据库的数据导出成excel文件,poi方式则是其中一种较为常用的导出框架.简单读取excel文件在之前的一篇有说明 本项目实现需求:user发出一个导出student信息 ...

  3. DS 壹之型 头指针与头结点

    之前结合网上博客整理的笔记,希望能帮你解除疑惑!    

  4. 【Tools】VMware虚拟机三种网络模式详解和操作

    目录 00. 目录 01. VMware虚拟机三种网络模式 02. Bridged(桥接模式) 03. NAT(地址转换模式) 04. Host-Only(仅主机模式) 00. 目录 @ 参考:htt ...

  5. 按键消抖——task任务和仿真平台搭建

    一.按键抖动原理 按键抖动原理:按键存在一个反作用弹簧,因此当按下或者松开时均会产生额外的物理抖动,物理抖动会产生电平的抖动. 消抖方法:一般情况下,抖动的总时间会持续20ms以内,按下按键后,等20 ...

  6. git clone一个仓库下的单个文件【记录】

    注意:本方法会下载整个项目,但是,最后出现在本地项目文件下里只有需要的那个文件夹存在.类似先下载,再过滤. 有时候因为需要我们只想gitclone 下仓库的单个或多个文件夹,而不是全部的仓库内容,这样 ...

  7. 关于Python中的可变对象与不可变对象的区别(转)

    转自:https://blog.csdn.net/rookinzhang/article/details/80259857 Python中可变对象和不可变对象:https://www.cnblogs. ...

  8. FastDFS安装指南

    FastDFS安装指南 提前准备好的文件资料: 1.FastDFS--tracker安装 1.1 FastDFS安装环境 FastDFS是C语言开发,建议在linux上运行,本教程使用Centos7. ...

  9. C#使用Linq to XML进行XPath查询

    最近在用到HtmlAgliltyPack进行结点查询时,发现这里选择结点使用的是XPath.所以这里总结一下在C#中使用XPath查询XML的方法.习惯了用Linq,这里也是用的Linq to xml ...

  10. web项目服务器安装及配置(虚拟机centOS7)

    一.安装VMware(如需) 1.首先下载VMware虚拟机,地址: https://www.vmware.com/products/workstation-pro/workstation-pro-e ...