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