RESTful-rest_framework认证组件、权限组件、频率组件-第五篇
认证组件、权限组件、频率组件总结:
认证组件格式:
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认证组件、权限组件、频率组件-第五篇的更多相关文章
- Rest_Framework之认证、权限、频率组件源码剖析
一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...
- rest-framework框架——认证、权限、频率组件
一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...
- restframework 认证、权限、频率组件
一.认证 1.表的关系 class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField( ...
- drf token刷新配置、认证组件(使用)、权限组件(使用)、频率组件(使用)、异常组件(使用)
目录 一.特殊路由映射的请求 二.token刷新机制配置(了解) 三.认证组件项目使用:多方式登录 1.urls.py 路由 2.views.py 视图 3.serializers.py 序列化 4. ...
- restful(3):认证、权限、频率 & 解析器、路由控制、分页、渲染器、版本
models.py中: class UserInfo(models.Model): name = models.CharField(max_length=32) psw = models.CharFi ...
- django-rest-framework 基础三 认证、权限和频率
django-rest-framework 基础三 认证.权限和频率 目录 django-rest-framework 基础三 认证.权限和频率 1. 认证 1.1 登录接口 1.2 认证 2. 权限 ...
- REST framwork之认证,权限与频率
认证组件 局部视图认证 在app01.service.auth.py: class Authentication(BaseAuthentication): def authenticate(self, ...
- Restful安全认证及权限的解决方案
一.Restful安全认证常用方式 1.Session+Cookie 传统的Web认证方式.需要解决会话共享及跨域请求的问题. 2.JWT JSON Web Token. 3.OAuth 支持两方和三 ...
- rest_framework 认证与权限
一 认证 1.1先写个类(认证组件) from app01 import models from rest_framework import exceptions from rest_framewo ...
- python全栈开发day101-认证组件、权限组件、频率组件
1.Mixins类分析 这两个函数都在GenericAPIView下,这就是为什么必须搭配继承GenericAPIView的原因. 这两个主要是get_object()较为复杂. 2.认证组件源码分析 ...
随机推荐
- 详细讲解:yii 添加外置参数 高级版本
在YII中,添加状态参数的形式 首先,我们在advanced\common\config\params.php文件中,添加我们要设置的参数: 要在控制器中进行使用的话,形式为:\Yii::$app-& ...
- 在linux 下为sublime Text 2 配置c#编译环境
各位看官别笑我,在虚拟机上跑了了xp xp里面安装了vs2008,然后电脑性能实在是太差了,所以装sublime用来编写代码,然后再统一由vs2008来调试. 说正事. 安装好sublime 之后, ...
- [转载]AngularJS入门教程03:迭代器
我们在上一步做了很多基础性的训练,所以现在我们可以来做一些简单的事情喽.我们要加入全文检索功能(没错,这个真的非常简单!).同时,我们也会写一个端到端测试,因为一个好的端到端测试可以帮上很大忙.它监视 ...
- netbackup :nbu备份 Hyper-V 遇到快照错误(状态码 156)
遇到快照错误(状态码 156) 下表介绍与 NetBackup 状态码 156 有关的 Hyper-V 问题. 表:状态码 156 的可能原因 状态码 156 的原因 说明及推荐操作 NetBacku ...
- Problem G: 角谷步数
Problem G: 角谷步数 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 78 Solved: 28[Submit][Status][Web Bo ...
- cf1151 B
题目连接 : https://codeforces.com/contest/1151/problem/B 可能我想法有问题,我怎么感觉B题的思路不直接想出来的,我想了一会才想出来,感觉不难,但可能有更 ...
- IDEA搭建Maven 的聚合项目
今天突然想把自己学习在eclipse上的maven聚合项目搭建到IDEA上,结果IDEA有太多的配置步骤,导致失败了很多次,终于在网上找到了一篇博客 https://blog.csdn.net/for ...
- 前端小记6——项目中常用的ES6方法
现在很多功能用es5的方法也能实现功能,但es6提供的方法显得更为高效.记录下目前常用的几个方法. 1.字符包含 通过str.includes('a')来判断, 若str中包含a则结果为true,否则 ...
- vue 采坑
1.ref 在父组件中访问子组件实例,或者直接操作DOM元素时需要ref <input ref="ipt"> 通过this.$refs.ipt 得到此input $re ...
- Linux下 tomcat 的开机自启动设置
每次开机都要启动tomcat,非常麻烦:通过直接修改系统文件,实现tomcat自启动: 1. 修改脚本文件rc.local:vim /etc/rc.d/rc.local 这个脚本是使用者自定的开机启动 ...