在前面的教程中我们介绍了什么是符合RESTful规范的API接口,并以博客为例使用了基于函数的视图(FBV)编写了对文章进行增删查改的API。在本篇文章中,我们将使用基于类的视图(Class-based View, CBV)重写之前的接口。如果你还没有阅读前两篇文章,建议先阅读。
为什么要使用基于类的视图(CBV)?
一个中大型的Web项目代码量通常是非常大的,如果全部使用函数视图写,那么代码的复用率是非常低的。而使用类视图呢,就可以有效的提高代码复用,因为类是可以被继承的,可以拓展的。特别是将一些可以共用的功能抽象成Mixin类或基类后可以减少重复造轮子的工作。
DRF推荐使用基于类的视图(CBV)来开发API, 并提供了4种开发CBV开发模式。
使用基础APIView类
使用Mixins类和GenericAPI类混配
使用通用视图generics.*类, 比如 generics.ListCreateAPIView
使用视图集ViewSet和ModelViewSet
很多人会疑惑,到底哪种CBV开发模式更好? 我们将逐一分析,并在文尾给出答案。本文代码较多,手机上如果竖屏阅读不方便,建议横屏阅读。
使用基础APIView类
DRF的APIView类继承了Django自带的View类, 一样可以按请求方法调用不同的处理函数,比如get方法处理GET请求,post方法处理POST请求。不过DRF的APIView要强大得多。它不仅支持更多请求方法,而且对Django的request对象进行了封装,可以使用request.data获取用户通过POST, PUT和PATCH方法发过来的数据,而且支持插拔式地配置认证、权限和限流类。
现在我们可以使用APIView类重写我们之前的函数视图了。
# blog/views.py
# 使用基础APIView类
from rest_framework.views import APIView
from django.http import Http404
from .models import Article
from .serializers import ArticleSerializer
class ArticleList(APIView):
"""
List all articles, or create a new article.
"""
def get(self, request, format=None):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid():
# 注意:手动将request.user与author绑定
serializer.save(author=request.user)
r