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
实例
函数视图
使用类视图吧骚年。
评论区