APIView
APIView是Django REST framework提供的所有视图的基类,继承自Django的View类。使用方式:
代码语言:javascript复制from rest_framework.views import APIView
APIView与View的不同之处在于:
- 传入到视图方法中的是Django REST framework的Request对象,而不是Django的HttpRequeset对象;
- 视图方法可以返回Django REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;(需要
from rest_framework.response import Response
) - 任何APIException异常都会被捕获到,并且处理成合适的响应信息;
- 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
- 不受csrf认证规则的限制,因为由as_view方法完成路由配置,返回配置函数是csrf_exempt(view)。
APIView与View的使用基本相同,像往常一样。依旧是get方法处理get请求,post方法处理post请求。除此之外,APIView增加了一些可插入的属性。最常用的是下面三个。
- authentication_classes列表或元祖,身份认证类
- permissoin_classes列表或元祖,权限检查类
- throttle_classes列表或元祖,流量控制类
基于类的视图
一个继承自APIView的视图可能如下所示:
代码语言:javascript复制from rest_framework.response import Response
from rest_framework.views import APIView
from book.models import BookInfo
from book.serializers import BookInfoSerializer
# Create your views here.
class BookInfoView(APIView):
"""书籍信息视图"""
def get(self, request, *args, **kwargs):
objs = BookInfo.objects.all()
res = BookInfoSerializer(objs, many=True)
return Response(res.data)
def post(self, request, *args, **kwargs):
data = request.data
name = data.get("name")
pub_date = data.get("pub_date")
obj = BookInfoSerializer(data={"name": name, "pub_date": pub_date})
if obj.is_valid():
obj.save()
return Response(obj.data)
else:
return Response(status=400)
关于APIView使用的Django REST framework的Request对象,以及上面使用的Response对象,在DRF的Request对象和Response对象中介绍。
基于函数的视图
有时候,我们并不需要使用类。为此,DRF提供了一组简单的装饰器,用于包装基于函数的视图以确保它们接收DRF的Request对象。
api_view()装饰器
api_view装饰器确保视图函数接收DRF的Request对象,此外还提供了请求方法限制。默认情况下只GET接受方法。其他方法将响应“405 Method Not Allowed”。一个可能的例子如下所示:
代码语言:javascript复制from rest_framework.decorators import api_view
@api_view(['GET', 'POST'])
def hello_world(request):
if request.method == 'POST':
return Response({"message": "Got some data!", "data": request.data})
return Response({"message": "Hello, world!"})
API策略装饰器
为了覆盖默认设置,REST framework 提供了一组额外的装饰器,可以添加到您的视图中。注意,这些必须在@api_view装饰器之后。,可用的装饰器如下所示:
代码语言:javascript复制@renderer_classes(...)
@parser_classes(...)
@authentication_classes(...)
@throttle_classes(...)
@permission_classes(...)
这些装饰器都接受一个参数,该参数必须是类的列表或元组。
参考资料: DRF视图文档