侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

DRF - 视图基类 APIView

barwe
2022-10-07 / 0 评论 / 0 点赞 / 672 阅读 / 1,534 字
温馨提示:
本文最后更新于 2023-06-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Views

类视图

用类视图而不是函数视图,聚合对同一类请求的处理。

REST framework 实现了APIView类(继承自 Django 的View类):

  • 传递给请求处理方法的请求是 REST framework 实现的Request实例,而不是 Django 默认的HttpRequest实例
  • 如有必要,请求处理方法需要返回一个 REST framework 实现的Response实例,而不是 Django 默认的HttpResponse实例
  • 任何APIException异常都会被正常捕获并且自动转换为一个合适的响应
  • 请求将在进入处理方法之前进行权限检查

APIView子类的写法与 Django 默认的View子类写法类似,除了需要添加几个额外的属性声明鉴权策略:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions
from django.contrib.auth.models import User

class ListUsers(APIView):
    authentication_classes = [authentication.TokenAuthentication]
    permission_classes = [permissions.IsAdminUser]
    
    def get(self, request, format=None):
        usernames = [user.username for user in User.objects.all()]
        return Response(usernames)

API 策略 Setter 属性

需要按需指定。

  • .renderer_classes
  • .parser_classes
  • .authentication_classes
  • .throttle_classes
  • .permission_classes
  • content_negotiation_class

API 策略 Getter 方法

不需要管这些方法。

  • .get_renderers(self)
  • .get_parsers(self)
  • .get_authenticators(self)
  • .get_throttles(self)
  • .get_permissions(self)
  • .get_content_negotiator(self)
  • .get_exception_handler(self)

API 策略实现方法

不需要管这些方法,在将请求分发给处理方法之前自动调用。

  • .check_permissions(self, request)
  • .check_throttles(self, request)
  • .perform_content_negotiation(self, request, force=False)

请求分派方法

视图对象会调用.dispatch()方法将请求分派到某个具体的处理方法,下面这些方法会自动按需调用:

  • .initial(self, request, ...): 在处理函数拿到请求之前执行一切必要的检查
  • .handle_exception(self, exc): 重新抛出异常或者将异常转换为响应。需要定制异常响应时可复写此方法
  • .initialize_request(self, request, ...): 保证处理函数接收到的请求是Request实例,而不是HttpRequest实例
  • .finalize_response(self, request, response, ...): 同上,保证处理函数返回的是Response实例,而不是HttpResponse实例

函数视图

使用类视图吧骚年。

0

评论区