DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
本节目录
一 认证组件
1. 局部认证组件
我们知道,我们不管路由怎么写的,对应的视图类怎么写的,都会走到dispatch方法,进行分发,
在咱们看的APIView类中的dispatch方法的源码中,有个self.initial(request, *args, **kwargs),那么认证、权限、频率这三个默认组件都在这个方法里面了,如果我们自己没有做这三个组件的配置,那么会使用源码中默认的一些配置。进源码去看看你就会看到下面三个东西:
目前为止大家知道的认证机制是不是有cookie、session啊,session更安全一些,但是你会发现session的信息都存到咱们的服务器上了,如果用户量很大的话,服务器压力是比较大的,并且django的session存到了django_session表中,不是很好操作,但是一般的场景都是没有啥问题的,现在生产中使用的一个叫做token机制的方式比较多,现在我们是不是就知道个csrf_token啊,其实token有很多种写法,如何加密,你是hashlib啊还是base64啊还是hmac啊等,是不是加上过期时间啊,是不是要加上一个secret_key(客户端与服务端协商好的一个字符串,作为双方的认证依据),是不是要持续刷新啊(有效时间要短,不断的更新token,如果在这么短的时间内还是被别人拿走了token,模拟了用户状态,那这个基本是没有办法的,但是你可以在网络或者网络设备中加安全,存客户的ip地址等,防黑客)等等。
大致流程图解:

首先我们需要创建一个表,用户表,里面放一个token字段,其实一般我都是放到两个表里面,和用户表是一个一对一关系的表,看代码:
urls.py内容如下:
#登陆认证接口 url(r'^login/$', views.LoginView.as_view(),), #别忘了$符号结尾
views.py内容如下:自己写一个每次登陆成功之后刷新token值
通过上面的代码我们将token返回给了用户,那么以后用户不管发送什么请求,都要带着我给它的token值来访问,认证token通过才行,并且更新token。
下面我们玩一下drf提供的认证组件的玩法。
DRF的认证组件
将来有些数据接口是必须要求用户登陆之后才能获取到数据,所以将来用户登陆完成之后,每次再过来请求,都要带着token来,作为身份认证的依据。
好,我们写一写获取token值,然后校验的功能,看views.py的代码:
urls.py内容如下:
url(r'^books/$', views.BookView.as_view(),),
通过postman发送请求,你会发现错误:

如果我们请求中带了数据库中保存的token值,那么就会成功获取数据,看数据库中的token值:

然后通过postman再请求,带着token值,看效果,成功了:

继承drf的BaseAuthentication认证类的写法:
带时间戳的随机字符串:
全局视图认证组件:
在settings.py文件中配置:如果我再app01文件夹下的service文件夹下的auth文件夹下写了我们自己的认证类,那么全局配置的写法就按照下面的方式写。
REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",] #里面是路径字符串
}
认证组件就说这些,看权限组件吧。
二 权限组件
局部视图权限:
在app01.service.permissions.py中
在views.py:
from app01.service.permissions import *
class BookViewSet(generics.ListCreateAPIView):
permission_classes = [SVIPPermission,]
queryset = Book.objects.all()
serializer_class = BookSerializers
全局视图权限:
settings.py配置如下:
REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
"DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",]
}
三 频率组件
局部视图throttle,反爬,防攻击
在throttles.py中:
在views.py中:
from app01.service.throttles import *
class BookViewSet(generics.ListCreateAPIView):
throttle_classes = [VisitThrottle,]
queryset = Book.objects.all()
serializer_class = BookSerializers
全局视图throttle
REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
"DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
"DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",]
}
内置throttle类
在throttles.py修改为:
class VisitThrottle(SimpleRateThrottle):
scope="visit_rate"
def get_cache_key(self, request, view):
return self.get_ident(request)
settings.py设置:
六 分页器组件
简单使用:
settings配置文件:
如果我们不想用全局的page_size配置,我们自己可以写个类来继承分页类组件,重写里面的属性:
还有我们玩的继承了ModelViewSet类的试图类使用分页器的写法:
还有个偏移分页,了解一下就行了
from rest_framework.pagination import LimitOffsetPagination



