概述
APIView
是DRF的视图层中最基本的类,它相当于Django中的View类,其他视图类都是通过继承APIView实现的。
GenericAPIView
继承于APIView
,在其父类的基础上为列表视图和详情视图添加了常用的行为。
Mixins
提供了一些基本视图行为的操作方法,如提供的list()
方法将返回查询集,等等。因为Python多继承的特性,因此,在定义视图时可以将GenericAPIView
和Mixins
进行灵活的组合。而DRF中就提供了许多这样的类可以供我们完成所有所需的View。
1.APIView
在DRF中提供了APIView
,继承于Django的View
,作为最基本的类视图,处理用户的请求并返回响应。和View相比,APIView有如下特点:
- 1.传递给处理方法的请求是DRF的
Request
实例,而不是Django的HttpRequest
实例; - 2.响应并返回的是DRF的
Response
对象,而不是Django的HttpResponse
对象; - 3.任何APIException异常都会被捕获并调制到适当的响应中;
- 4.会对接收的请求进行身份认证和权限的检查。
和使用View类似,使用APIView时,接收的请求会被dispatch到对应的方法中,如get()
、post()
……此外,还可以设置许多属性来控制API各个方面的策略。
使用APIView
时需要导入其所在模块:
from rest_framework.views import APIView
基本的使用APIView方式举例如下:
class SnippetList(APIView):
# 处理GET请求
def get(self, request, format=None):
snippet = Snippet.objects.all()
serializer = SnippetSerializer(snippet, many=True)
return Response(serializer.data)
# 处理POST请求
def post(self, request, format=None):
serializer = SnippetSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
1.1.常用属性
.authentication_classes
该属性用于指定当前View endpoint的身份验证类,如:
from rest_framework.authentication import TokenAuthentication
class TestView(APIView):
authentication_classes = (TokenAuthentication,)
# ......
使用authentication_classes
设置的身份验证类将仅仅对该View验证有效,如果需要对整个项目有效,则需要在settings.py配置文件中进行设置:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
# ......
'rest_framework.authentication.authentication.TokenAuthentication',
)
}
DEFAULT_AUTHENTICATION_CLASSES
也是身份验证类列表的默认值。
.permission_classes
该属性用于指定当前View endpoint的权限类列表,如:
from rest_framework import permissions
class SnippetList(APIView):
# ...
permission_classes = (permissions.IsAuthenticatedOrReadOnly,permissions.IsAuthenticated,permissions.IsAdminUser)
# ...
如果不指定该属性,则默认使用settings.DEFAULT_PERMISSION_CLASSES
中指定的权限列表。
APIView
是DRF中所有View的基类,也是DRF中视图层的基础,但APIView
并不是重点,重点是下面的GenericAPIView
和Mixins
以及两个混合组成的许