Class-based Views 类视图
Django的类视图是一个受欢迎的视图,违背了旧的风格
——来自范·里斯
REST框架提供了一个APIView类,它是Django的视图类的子类。
APIView类与常规的View类不同:
1 传递给处理程序方法的请求将是REST框架的请求实例,而不是Django的实例。
2 处理程序方法可能会返回REST框架的Response,而不是Django的HttpResponse。视图将管理内容协商,并在响应中设置正确的渲染器。
3 任何APIException异常都会被捕获并被协调到适当的响应中。
4 传入请求进行认证和相应的权限和/或油门检查将调度请求发送到处理程序方法之前运行。
使用APIView类与使用常规的View类几乎相同,与往常一样,传入的请求被分派到适当的处理程序方法,例如.get()或.post()。另外,可以在控制API策略的各个方面的类上设置一些属性。
例如:
API policy attributes API策略属性
以下属性控制的API Views的可插入的类。
.renderer_classes
.parser_classes
.authentication_classes
.throttle_classes
.permission_classes
.content_negotiation_class
API policy instantiation methods API策略实例化方法
REST框架使用下面的方法来实例化各种可插入的API策略。您通常不需要覆盖这些方法。
.check_permissions(self, request)
.check_throttles(self, request)
.perform_content_negotiation(self, request, force=False)
Dispatch methods 调度方法
下面的方法由视图的.dispatch()方法直接调用。这些操作执行任何需要在调用处理程序方法之前或之后发生的操作,例如.get()、.post()、put()、patch()和.delete()。
.initial(self, request, *args, **kwargs)
在调用处理程序方法之前执行任何需要发生的操作。该方法用于执行权限和节流,并执行内容协商。
您通常不需要覆盖这个方法。
.handle_exception(self, exc)
处理程序方法抛出的异常将被传递给这个方法,该方法要么返回一个Response实例,要么重新抛出异常。
默认的实现处理rest_framework.exceptions.APIException的任何子类,以及Django的Http404和PermissionDenied异常,并返回一个对应的错误响应。
如果您需要定制您的API返回的错误响应,您应该子类化这个方法。
.initialize_request(self, request, *args, **kwargs)
确保传递给处理程序方法的Request对象的请求,而不是通常的 Django HttpRequest 实例。
您通常不需要覆盖这个方法。
.finalize_response(self, request, response, *args, **kwargs)
确保从处理程序方法返回的任何Response对象都将被呈现为正确的内容类型,这是由内容协商确定的。
您通常不需要覆盖这个方法。
Function Based Views 基于函数的视图
说"基于类的视图"总是更好的解决方案是错的。
— Nick Coghlan
REST框架还允许您使用常规的基于函数的视图。它提供了一组简单的装饰器,它们将基于函数的视图封装起来,以确保它们接收到Request的实例(而不是平常的Django HttpRequest),并允许它们返回Response(而不是Django的HttpRequest),并允许您配置如何处理请求。
@api_view()
Signature: @api_view(http_method_names=['GET'], exclude_from_schema=False)
这个功能的核心是api_view修饰器,它接受了一个您的视图应该响应的HTTP方法列表。例如,这就是如何编写一个非常简单的视图,只需要手动返回一些数据:
该视图将使用在设置中指定的缺省渲染器、解析器、身份验证类等。
默认情况下,只有GET方法才会被接受。其他方法将使用“405Method Not Allowed”进行响应。要改变这种行为,请指定视图允许的方法,如:
API policy decorators API策略装饰器
为了覆盖默认设置,REST框架提供了一组附加的装饰器,这些装饰器可以添加到您的视图中。这些必须在紧跟着@apiview装饰器之后出现。例如,要创建一个视图,它使用节流器来确保它只能每天被特定用户调用一次,使用@throttle_classes装饰器,传递一个节流类列表:
这些装饰器对应于上面描述的APIView子类上的属性。
可用的装饰器有:
@renderer_classes(...)
@parser_classes(...)
@authentication_classes(...)
@throttle_classes(...)
@permission_classes(...)
每个修饰符都有一个单独的参数,它必须是一个类的列表或元组。
608

被折叠的 条评论
为什么被折叠?



