认证组件、权限组件、频率组件总结: 

认证组件格式:

1 写一个认证类
from rest_framework.authentication import BaseAuthentication
class MyAuth(BaseAuthentication):
def authenticate(self,request):
# request 是封装后的
token = request.query_params.get('token')
ret = models.UserToken.objects.filter(token=token).first()
if ret:
# 认证通过
return
else:
raise AuthenticationFailed('认证失败')
#可以不写了
def authenticate_header(self,ss):
pass
2 局部使用
authentication_classes=[MyAuth,MyAuth2]
3 全局使用
查找顺序:自定义的APIView里找---》项目settings里找---》内置默认的
REST_FRAMEWORK={
'DEFAULT_AUTHENTICATION_CLASSES':['utils.common.MyAuth',] }

权限组件格式:

1 写一个类
class MyPermission():
def has_permission(self,request,view):
token=request.query_params.get('token')
ret=models.UserToken.objects.filter(token=token).first()
if ret.user.type==2:
# 超级用户可以访问
return True
else:
return False
2 局部使用:
permission_classes=[MyPermission,]
3 全局使用:
REST_FRAMEWORK={
'DEFAULT_PERMISSION_CLASSES':['utils.common.MyPermission',]
}

频率组件格式:

1 写一个类:
from rest_framework.throttling import SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle):
scope = 'xxx'
def get_cache_key(self, request, view):
return self.get_ident(request)
2 在setting里配置:
'DEFAULT_THROTTLE_RATES':{
'xxx':'5/h',
}
3 局部使用
throttle_classes=[VisitThrottle,]
4 全局使用
REST_FRAMEWORK={
'DEFAULT_THROTTLE_CLASSES':['utils.common.MyPermission',]
}

实例简介:

只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件

结构目录:

1.mode层

class UserInfo(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32)
ss=((1,'超级用户'),(2,'普通用户'),(3,'二逼用户'))
type=models.IntegerField(choices=ss,null=True) class UserToken(models.Model):
user=models.OneToOneField(to='UserInfo')
token=models.CharField(max_length=64)

2.views层

from django.shortcuts import render,HttpResponse

# Create your views here.

import json
from rest_framework.views import APIView
from app01 import models
from utils.common import *
from rest_framework.response import Response #登录类
class Login(APIView):
def post(self,request,*args,**kwargs): #实例化响应状态函数(添加登录成功后的状态信息)
response=MyResponse() #判断用户名、密码是否正确
name=request.data.get('name')
pwd=request.data.get('pwd')
user=models.UserInfo.objects.filter(name=name,pwd=pwd).first() #如果登录成功生成一个随机字符串
if user:
#生成一个随机字符串
token=get_token(name)
#token表里面的信息,如果不存在,会创建,如果存在会更新token值(因为进行了随机时间加盐),使用的是update_or_create
ret=models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
# ret=models.UserInfo.objects.update_or_create(id=1,defaults={'token':token}) 不是只能写user或者可以写id response.status=100
response.msg='登录成功'
response.token=token
print(response.get_dic())
else:
response.msg="用户名密码错误"
# response.data='ddd' 最后response.get_dic(),都可以把这些信息返回 #里面需要传入个字典
return Response(response.get_dic()) #查看课程类
class Course(APIView):
#局部登录认证
authentication_classes = [MyAuth,]
#局部权限认证
permission_classes = [Mypermission,]
#局部频率认证
throttle_classes = [VisitThrottle,]
def get(self,request):
print(request.user)
print(request.auth)
return HttpResponse(json.dumps({'name':'python'}))

3.url与settings

#url
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^course/', views.Course.as_view()),
url(r'^login/', views.Login.as_view()),
] #settings
#全局使用认证
REST_FRAMEWORK={
#登录认证,全局的登录认证刚开始不要加,如果添加后初始登录也会要求认证,那时数据库还没有数据,会有问题(所以可以在认证类里面设置局部的认证并设置为空)
# 'DEFAULT_AUTHENTICATION_CLASSES':['utils.common.MyAuth',],
#频率
'DEFAULT_THROTTLE_RATES':{
# 'xxx':'5/m',
'xxx':'5/hdddddddddddddddddddddddddddddd',
} }  例如解决全局配置后login初始登录会验证的问题:
class Login(APIView):
#为了可以在全局里面统一设置,并不影响初始这里的登录
authentication_classes=[] def post(self,request,*args,**kwargs):
    ...
    ...

4.utils-common配置(组件类)

登录状态信息:

#账户登录状态信息
class MyResponse():
def __init__(self):
#1001表示失败
self.status = 1001
self.msg = None def get_dic(self):
#返回是字典格式的属性信息
return self.__dict__

随机验证码:

#传入用户名生成一个随机验证码token
def get_token(name):
md = hashlib.md5()
md.update(name.encode('utf-8'))
md.update(str(time.time()).encode('utf-8'))
return md.hexdigest()

认证组件类:

from rest_framework.authentication import BaseAuthentication
from app01 import models
from rest_framework.exceptions import APIException,AuthenticationFailed
#认证组件
class MyAuth(BaseAuthentication):
def authenticate(self, request):
#拿到的是随机token的值
token = request.query_params.get('token')
ret = models.UserToken.objects.filter(token=token).first()
if ret:
#认证通过
return ret.user,ret
else:
#认证失败
raise AuthenticationFailed('认证失败')

权限组件类:

#权限组件
from rest_framework.permissions import BasePermission
class Mypermission(BasePermission):
message = '不是超级用户,查看不了' def has_permission(self, request, view):
token = request.query_params.get('token')
ret = models.UserToken.objects.filter(token=token).first() #拿到userinfo表格对应的type字段,输出models里面userinfo表格里面type数字对应的“超级用户”等字符串信息
print(ret.user.get_type_display())
if ret.user.type==1:
return True #如果是Flase的情况就会,打印上面的message信息
else:
return False

频率组件类:

#频率组件
from rest_framework.throttling import SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle):
scope = 'xxx'
def get_cache_key(self, request, view):
return self.get_ident(request)

运行效果展示:

准备工作:

1.userinfo数据表先添加2条数据,做演示

情况1:未登录情况下发送get请求,会提示认证失败(因为没有带token信息)

情况2:post请求登录login,用户信息写入数据库,同时生成将出入的name+time盐,写入UserToken表token字段

情况3:get请求携带token字符串,从而验证权限认证、频率认证

自定义频率类:

自定义逻辑

#(1)取出访问者ip
# (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走
# (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
# (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
# (5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败

  

class MyThrottles():
VISIT_RECORD = {}
def __init__(self):
self.history=None
def allow_request(self,request, view):
#(1)取出访问者ip
# print(request.META)
ip=request.META.get('REMOTE_ADDR')
import time
ctime=time.time()
# (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问
if ip not in self.VISIT_RECORD:
self.VISIT_RECORD[ip]=[ctime,]
return True
self.history=self.VISIT_RECORD.get(ip)
# (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
while self.history and ctime-self.history[-1]>60:
self.history.pop()
# (4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
# (5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败
if len(self.history)<3:
self.history.insert(0,ctime)
return True
else:
return False
def wait(self):
import time
ctime=time.time()
return 60-(ctime-self.history[-1])

RESTful-rest_framework认证组件、权限组件、频率组件-第五篇的更多相关文章

  1. Rest_Framework之认证、权限、频率组件源码剖析

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

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

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

  3. restframework 认证、权限、频率组件

    一.认证 1.表的关系 class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField( ...

  4. drf token刷新配置、认证组件(使用)、权限组件(使用)、频率组件(使用)、异常组件(使用)

    目录 一.特殊路由映射的请求 二.token刷新机制配置(了解) 三.认证组件项目使用:多方式登录 1.urls.py 路由 2.views.py 视图 3.serializers.py 序列化 4. ...

  5. restful(3):认证、权限、频率 & 解析器、路由控制、分页、渲染器、版本

    models.py中: class UserInfo(models.Model): name = models.CharField(max_length=32) psw = models.CharFi ...

  6. django-rest-framework 基础三 认证、权限和频率

    django-rest-framework 基础三 认证.权限和频率 目录 django-rest-framework 基础三 认证.权限和频率 1. 认证 1.1 登录接口 1.2 认证 2. 权限 ...

  7. REST framwork之认证,权限与频率

    认证组件 局部视图认证 在app01.service.auth.py: class Authentication(BaseAuthentication): def authenticate(self, ...

  8. Restful安全认证及权限的解决方案

    一.Restful安全认证常用方式 1.Session+Cookie 传统的Web认证方式.需要解决会话共享及跨域请求的问题. 2.JWT JSON Web Token. 3.OAuth 支持两方和三 ...

  9. rest_framework 认证与权限

    一  认证 1.1先写个类(认证组件) from app01 import models from rest_framework import exceptions from rest_framewo ...

  10. python全栈开发day101-认证组件、权限组件、频率组件

    1.Mixins类分析 这两个函数都在GenericAPIView下,这就是为什么必须搭配继承GenericAPIView的原因. 这两个主要是get_object()较为复杂. 2.认证组件源码分析 ...

随机推荐

  1. LeetCode Minimum Depth of Binary Tree 找最小深度(返回最小深度)

    题意:找到离根结点最近的叶子结点的那一层(设同一层上的结点与根结点的距离相等),返回它所在的层数. 方法有: 1.递归深度搜索 2.层次搜索 方法一:递归(无优化) /** * Definition ...

  2. TTTAttributedLabel

    TTTAttributedLabel 库地址 https://github.com/TTTAttributedLabel/TTTAttributedLabel #import "ViewCo ...

  3. Django Form 表单

    Form 表单功能 生成HTML表单元素检查表单元素的合法性验证如果错误,重复显示表单数据类型转换 Form相关的对象 Widget 渲染成HTML元素的工具Field Form对象中的一个字段For ...

  4. iOS 7系列译文:认识 TextKit

    OS 7:终于来了,TextKit.   功能   所以咱们到了.iOS7 带着 TextKit 登陆了.咱们看看它可以做什么!深入之前,我还想提一下,严格来说,这些事情中的大部分以前都可以做.如果你 ...

  5. 在RichTextBox控件中显示RTF格式文件

    实现效果: 知识运用:    RichTextBox控件的LoadFile方法 //将文件内容加载到RichTextBox控件中 public void LoadFile(string path,Ri ...

  6. 图片url转base64

    var xhr = new XMLHttpRequest() // 配置的代理,解决跨域问题 xhr.open('GET', url.replace('http://xxx.com', '/img') ...

  7. P4744 A’s problem(a)

    时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背景的题目,小A也是一个有故事的人.但可惜的 ...

  8. nginx安装与部署

    1:安装工具包 wget.vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc g ...

  9. ATM-interface-bank

    from lib import commonfrom db import db_handler user_logger = common.get_logger('bank') def check_ba ...

  10. React学习记录二

    环境基本弄清楚了以后,开始总会写个hello world什么的,开发做了这么久了,就跳过这一步吧. 还是从打开vscode说起吧,这里文件菜单打开一个文件夹Demos,查看菜单打开集成终端,也可以使用 ...