认证、权限、频率是层层递进的关系

  权限业务时认证+权限

  频率业务时:认证+权限+频率

局部认证方式

from django.conf.urls import url,include
from django.contrib import admin
from api import views urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^auth/', views.AuthView.as_view()),
url(r'^books/', views.booksView.as_view()),
url(r'^books_detail/(\d+)/$', views.book_detail.as_view()),
url(r'^oderDetial/$', views.OderDetialView.as_view()), ]

urls.py

from rest_framework.views import APIView
from api.models import *
import uuid
from django.http import JsonResponse
from rest_framework.response import Response#渲染器
from api.util.Myserializer import BookSerializers
from rest_framework import exceptions#抛异常
from rest_framework.generics import GenericAPIView
from rest_framework.viewsets import GenericViewSet
from rest_framework.authentication import BaseAuthentication # Create your views here. ORDER_DICT = {
1:{
'name': "媳妇",
'age':18,
'gender':'男',
'content':'...'
},
2:{
'name': "老狗",
'age':19,
'gender':'男',
'content':'...。。'
},
} class AuthView(APIView):
def post(self,request): ret={'code':1000,'msg':None}
# 从前端获取用户名密码
try:
user=request._request.POST.get('username')
pwd=request._request.POST.get('password')
# 取数据库校验
obj=User.objects.filter(name=user,pwd=pwd).first() if not obj:
ret['code']=1001
ret['msg']='用户名密码错误'
# 登录成功生成token写入token表(如果有则更新,没有则创建)
token=str(uuid.uuid4())
Token.objects.update_or_create(user=obj,defaults={'token':token})
ret['token']=token
except Exception as e:
ret['code']=1002
ret['msg']='请求异常'
return JsonResponse(ret) class Authtication(object):
def authenticate(self,request):
# 接收来自前端发来的token值
token = request._request.GET.get('token')
# 从数据库中查找
token_obj=Token.objects.filter(token=token).first()
if not token_obj:
raise exceptions.AuthenticationFailed('用户认证失败')
# 在rest_framework内部会将两个字段赋值给request,以供后续使用
return (token_obj.user,token_obj)
def authenticate_header(self,request):
pass class OderDetialView(APIView):
authentication_classes = [Authtication,]
def get(self,request):
ret={'code':1000,'msg':None,'data':None} ret['data']=ORDER_DICT
return JsonResponse(ret)

views.py

from django.db import models

# Create your models here.
from django.db import models # Create your models here. class User(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32)
type_choices=((1,"普通用户"),(2,"VIP"),(3,"SVIP"))
user_type=models.IntegerField(choices=type_choices,default=1) class Token(models.Model):
user=models.OneToOneField("User")
token = models.CharField(max_length=128) def __str__(self):
return self.token

modesl.py

postman执行:

  

全局认证方式

settings.py配置如下:

REST_FRAMEWORK={
'DEFAULT_AUTHENTICATION_CLASSES':['app02.service.auth.Authtication',
]
}
from app02.models import *
from rest_framework import exceptions #不继承BaseAuthentication也可以
class Authtication(object):
def authenticate(self,request):
token=request._request.GET.get('token')
token_obj=UserToken.objects.filter(token=token).first()
if not token_obj:
raise exceptions.AuthenticationFailed('用户认证失败')
#rest framework内部会将这两个字段赋值给request,以供后续操作使用
return (token_obj.user,token_obj) def authenticate_header(self, request):
pass

app02.service.auth.py

认证源码分析流程:

权限

class permission(object):
def has_permission(self,request,view):
if request.user.user_type !=2:
return True
return False class OderDetialView(APIView):
# authentication_classes = [Authtication,]
permission_classes = [permission,]
def get(self,request):
ret={'code':1000,'msg':None,'data':None}
print(request.user.user_type,
    'user表中填入的user_type类型,
    权限认证时重新封装了新的request.user(user是数据库关联字段))
if request.user.user_type==2:
ret['data']=ORDER_DICT
return JsonResponse(ret)

频率

import time
VISIT_RECORD = {} # 格式是{id:[time2]} # 访问频率类
class VisitThrottle(object):
"""60秒内只能访问3次"""
def __init__(self):
self.history = None def allow_request(self, request, view):
# 获取用户IP
remote_addr = request.META.get('REMOTE_ADDR')
ctime = time.time()
print(remote_addr)
if remote_addr not in VISIT_RECORD: # 如果是第一次访问,就存放访问时间以及IP地址
VISIT_RECORD[remote_addr] = [ctime,] # 添加到VISIT_RECORD中
return True
history = VISIT_RECORD.get(remote_addr) # 不是第一次访问,先获取记录
self.history = history
print("111:",history)
while history and history[-1] < ctime - 60: # 如果最早一次访问时间超过一分钟,就删掉 去掉history and 后把while改成if,可以实现一样的功能
# 上一行代码中while循环一直循环,如果列表history为空,循环的时候都会报错,因为找不到history[-1]这个值,所以要加上history,用来跳出循环,防止代码出错
history.pop() if len(history) < 3: # 不用写else,如果不小于3,会有错误处理机制,直接拒绝访问。
history.insert(0, ctime) # 按照索引插入元素
return True
def wait(self):
ctime = time.time()
return 60 - (ctime - self.history[-1])

restful知识点之三restframework认证-->权限-->频率的更多相关文章

  1. 实战-DRF快速写接口(认证权限频率)

    实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...

  2. rest framework 认证 权限 频率

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

  3. 8) drf 三大认证 认证 权限 频率

    一.三大认证功能分析 1)APIView的 dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial(request, *ar ...

  4. restful知识点之六rest-framework组件流程图

  5. DRF-认证 权限 频率组件

    补充 1 认证 权限 频率组件原理基本相同 2 认证相关: session cookie token 认证相关的  这里用token token 1 有时间限制,超时则失效 2 每次登录更换一个tok ...

  6. DRF-认证权限频率

    目录 DRF-认证权限频率 认证 登录接口 认证 权限 作用 使用 频率 作用 使用 认证权限频率+五个接口 模型 视图 序列化器 认证权限频率类 配置文件 路由 DRF-认证权限频率 前后端混合开发 ...

  7. Rest-Framework组件源码之认证、频率、权限

    一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...

  8. rest-framework框架 -- 认证权限流程源码

    认证权限 解析BaseAuthentication源码 # 做认证权限 from rest_framework import exceptions from ..models import * cla ...

  9. django身份认证、权限认证、频率校验使用及源码分析

    一. 身份认证源码分析 1.1 APIView源码的分析 APIView源码之前分析过https://www.cnblogs.com/maoruqiang/p/11135335.html,里面主要将r ...

随机推荐

  1. windows电脑配置

    1.本地电脑通过修改hosts文件实现域名本地解析 以管理员身份打开记事本 并打开C:\Windows\System32\drivers\etc 路径下的hosts文件 在文件末尾添加如下

  2. android studio2.3.3 模拟器 Jni函数调用C++对象,lldb调试this指针和相关变量显示无效的原因

    android studio2.3.3 的版本中 Jni函数调用C++对象,对象调用相关的成员函数, lldb调试,变量跟踪窗口,this指针和相关变量显示无效的原因,但这些参数实际是有效的,只是de ...

  3. Linux下mysq基础命令(二)

    1. 创建数据库相关命令: mysql> STATUS(\s) - 列出当前mysql的相关状态信息 mysql> SHOW DATABASES; - 显示数据库列表 mysql> ...

  4. ServiceLoader解读

    SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或者插件的.在java.util.ServiceLoader的文档里有比较详细的介绍. 简 ...

  5. JavaScript数据结构-17.图结构

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 深度学习(十五) TextCNN理解

    以下是阅读TextCNN后的理解 步骤: 1.先对句子进行分词,一般使用“jieba”库进行分词. 2.在原文中,用了6个卷积核对原词向量矩阵进行卷积. 3.6个卷积核大小:2个4*6.2个3*6和2 ...

  7. CentOS VNC

    CentOS Linux:1.需要安装的包:tigervnc,tigervnc-server 2.配置显示分辨率.桌面和用户:编辑 /etc/sysconfig/vncservers参考注释掉的最后两 ...

  8. JAVA-3NIO之Buffer和Buffer之Scatter/Gather

    注意:转载自并发编程网,java nio系列教程 1.Buffer Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是 ...

  9. [转]从客户端中检测到有潜在危险的Request.Form值的详细解决

    本文转自:http://www.knowsky.com/887593.html asp.net1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力.当用户试图用之类的输入影响页面返回结 ...

  10. PictureBox控件

    PictureBox控件可以显示来自位图.图标或者元文件,以及来自增强的元文件.JPEG.GIF文件的图形,如果控件不足以显示整幅图像,则裁剪图像以适应控件的大小. Sizemode 图片的大小方式 ...