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.认证组件源码分析 ...
随机推荐
- HDU 1114 Piggy-Bank 猪仔储钱罐(完全背包)
题意: 给定一个存钱罐中要存硬币,知道空罐的重量和欲装满的重量,是否能装入?若能,打印最小价值.(注:能装的硬币重量一定刚刚好,里面的总价值要达到最小) 输入: 包含了T个测试例子,在第一行给出.接下 ...
- 在 Windows下用 Visual Studio 编译 OpenSSL 1.1.0
到OpenSSL官方网站下载OpenSSL源代码包 1.下载 openssl-1.1.0.tar.gz 2.安装 ActivePerl, 可以到http://www.activestate.com/a ...
- leetcode--3
1. 题目: Longest Substring Without Repeating Characters Given a string, find the length of the longest ...
- 输出流缓冲的意义 何时缓冲 Stdout Buffering
From : https://eklitzke.org/stdout-buffering 译者:李秋豪 大多数编程语言默认提供了i/o缓冲特性,因为这会使得输出更加有效率.这些缓冲功能大都是默默工作& ...
- python_38_try-except异常处理语句及raise的使用
# i=10 # print(30/(i-10)) # #程序将会出现以下报错信息 # # Traceback (most recent call last): # # File "C:/U ...
- 第十一篇、UITableView headerview下拉放大
核心代码: -(void)createTableViewHeaderView{ _tableViewHeaderView = [[UIView alloc] initWithFrame:(CGRect ...
- C/C++程序基础 (四)字符串
字符串与数字转化 数字转换字符串:itoa, ltoa, ultoa ; gcvt, ecvt, fcvt 字符串转数字:atoi, atof(双精度浮点), atol:strtod(双精度浮点), ...
- 使用paramiko报错:CryptographyDeprecationWarning: Support for unsafe construction of public numbers from encoded data will be removed in a future version. Please use EllipticCurvePublicKey.from_encoded_poi
1.paramiko不支持cryptography-2.6.1 pip3 uninstall cryptography==2.6.1 2.paramiko 支持cryptography-2.4.2 p ...
- 《TensorFlow实战》中AlexNet卷积神经网络的训练中
TensorFlow实战中AlexNet卷积神经网络的训练 01 出错 TypeError: as_default() missing 1 required positional argument: ...
- 利用Filter解决跨域请求的问题
1.为什么出现跨域. 很简单的一句解释,A系统中使用ajax调用B系统中的接口,此时就是一个典型的跨域问题,此时浏览器会出现以下错误信息,此处使用的是chrome浏览器. 错误信息如下: jquery ...