1、什么是drf组件
drf的全称是Django RESTful Framework;
它是一个基于django开发的组件,本质是一个django的app;
drf可以帮我们快速开发出一个遵循restful规范的程序。
2、drf组件提供的功能
1.免除csrf认证
2.视图(三种:(1)APIView,(2)ListAPIview,(3)GenericViewSet)
3.版本处理
4.认证
5.权限
6.节流(频率限制)
7.解析器
8.筛选器
9.分页
10.序列化和数据校验:可以对QuerySet进行序列化,也可以对用户提交的数据进行校验——展示特殊的数据
depth
source:无需加括号,在源码内部会去判断是否可执行,如果可执行自动加括号。【多对一、一对一/choice】
SerializerMethodField定义钩子方法【多对多】
11.渲染器:可以帮我们把json数据渲染到drf自己的页面上。
3、drf的主要视图有哪些?
主要视图有3种:APIView,ListAPIview,GenericViewSet。
第一种:APIView
第一种遵循了CBV的模式,里面的功能比较多但是需要自己写的代码也有很多
提供了免除csrf认证,版本处理、认证、权限、节流、解析器、筛选器、分页、序列化、渲染器
第二种:ListAPIView,RetrieveAPIView,CreateAPIView,UpdateAPIView,DestroyAPIView
第二种则在第一种的基础上,封装了许多我们需要自己的写的代码,许多功能的实现只需要给专属的变量名赋值就可以实现该功能
第三种:GenericViewSet,ListModelMixin,RetrieveModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin
第三种则重构了APIView中的as_view()方法,结合请求方法和不同Mixin类的方法名从而进行执行不同的功能。
与前面两种最主要的区别是url路由中as_view()方法中需要传值。
目前使用的主要目的是把第二种的bug(查询全部数据的功能和查询单个数据的功能无法在一个类中实现)实现在一个类中!
4、版本处理
DRF提供了几种版本控制类,如URLPathVersioning、NamespaceVersioning和AcceptHeaderVersioning等。开发人员可以根据自己的需求选择合适的版本控制类。
在Django REST Framework中使用版本控制,需要在settings.py文件中配置版本控制类。可以使用DEFAULT_VERSIONING_CLASS设置来指定版本控制类的名称.
# settings.py
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning', # 版本验证
'DEFAULT_VERSION': 'v2', # 默认版本
'ALLOWED_VERSIONS': ['v1', 'v2'], # 有效版本
}
# 接着在注册的 API 接口前带上版本号:
# urls.py
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from .views import UserViewSet
urlpatterns = [
path('api/v1/users/', UserViewSet.as_view({'get': 'list'}), name='user-list'),
]
urlpatterns = format_suffix_patterns(urlpatterns)
5、drf认证
REST framework 提供了4种认证方式:BasicAuthentication、SessionAuthentication、TokenAuthentication、RemoteUserAuthentication等。
(DRF的认证是在定义有权限类(permission_classes)的视图下才有作用)
(1)BasicAuthentication 该认证方案使用 HTTP Basic Authentication,并根据用户的用户名和密码进行签名。
(2)SessionAuthentication 此认证方案使用 Django 的默认 session 后端进行认证。
(3)TokenAuthentication 此认证方案使用简单的基于令牌的 HTTP 认证方案。
(4)RemoteUserAuthentication 这种身份验证方案允许您将身份验证委托给您的 Web 服务器,该服务器设置 REMOTE_USER 环境变量。
# setting.py
INSTALLED_APPS = (
...
'rest_framework.authtoken' # 迁移数据库时(python manage.py migrate)会生成一个token表用于存储token信息
)
# TokenAuthentication身份验证
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication', # drf的身份认证类
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', # def的权限验证
)
}
6、drf权限
drf 提供了5种权限:AllowAny、IsAuthenticated、IsAdminUser、IsAuthenticatedOrReadOnly、DjangoModelPermissions
(1)AllowAny权限类将允许不受限制的访问,而不管该请求是否已通过身份验证或未经身份验证。
(2)IsAuthenticated 权限类将拒绝任何未经身份验证的用户的权限,并允许其他权限。 如果你希望你的API仅供注册用户访问,则此权限适用。
(3)IsAdminUser 除非user.is_staff为True,否则IsAdminUser权限类将拒绝任何用户的权限,在这种情况下将允许权限。
(4)IsAuthenticatedOrReadOnly 将允许经过身份验证的用户执行任何请求。只有当请求方法是“安全”方法(GET, HEAD 或 OPTIONS)之一时,才允许未经授权的用户请求。
(5)DjangoModelPermissions 此权限类与Django的标准django.contrib.authmodel权限相关联。此权限只能应用于具有.queryset属性集的视图。只有在用户通过身份验证并分配了相关模型权限的情况下,才会被授予权限。
# setting.py 添加配置
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication', # drf的身份认证类
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', # def的权限验证
)
}
7、drf节流处理
匿名用户通过ip地址来控制访问频率,已登录用户通过id来控制
首先要设置配置文件:
# 也可以设置全局,
"DEFAULT_THROTTLE_CLASSES":["rest_framework.throttling.AnonRateThrottle",]
# 设置访问频率——一分钟10次
"DEFAULT_THROTTLE_RATES": {
"anon":"10/m"
}
- 实现原理
把所有登录记录时间放在一个列表中,当用户请求网页的时候,用现在的时间减去约束的时间间隔,然后把小于这个时间记录排除,再计算出时间间隙的记录条数,
如果其中的条数小于规定的条数则可以访问并且把当前时间添加进列表中,如果大于或等于则不让其访问。
- 具体流程
当用户请求网页的时候,后台允许该界面的url中的as_views(),运行源码的APIView中的dispatch方法,运行initial方法,里面的check_throttles方法,
循环运行节流类中的allow_request方法,但是AnonRateThrottle等类中没有,去执行SimpleRateThrottle类中的allow_request方法,里面就是实现原理中的代码,
如果可以访问返回True,如果不让访问则返回False,之后返回check_throttles,如果是False则运行SimpleRateThrottle类中的wait方法得到需要等待的时间在页面上显示!
8、序列化器
REST framework提供了两种序列化器:Serializer类和ModelSerializer类。
(1)Serializer 是对对象的序列化和反序列化
class Book(models.Model):
id = models.IntegerField(primary_key=True)
title = models.CharField(max_length=255)
desc = models.CharField(max_length=255)
is_deleted = models.IntegerField(choices=[(1, "删除"), (0, "未删除")])
author = models.CharField(max_length=255)
(2)ModelSerializer 是将model中定义的字段直接序列化处理
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ['id', 'account_name', 'users', 'created']
ModelSerializer 会自动生成model字段对应的Field不用我们定义。
标签:DEFAULT,面经,rest,认证,framework,权限,drf From: https://www.cnblogs.com/lanjianhua/p/18451243