API Guide(三)之Views

Class-based Views

Django‘s class-based views are a welcome departure from the old-style views.

Reinout van Rees

REST框架提供了一个APIView类,which subclasses Django‘s View class.

APIView类与普通View类有以下不同:

  • 传递给the handler methods 的Requests 将是REST框架的Request实例,而不是Django的HttpRequest实例。
  • Handler methods 可能返回REST框架的Response,而不是Django的HttpResponse。该视图将管理 content negotiation并根据响应设置正确的渲染器。
  • 任何APIException异常都将被捕获并被调解为适当的响应。
  • 在请求发送到处理程序方法之前,传入请求将被认证,并运行适当的permission and/or throttle checks。

使用APIView类与常规View类一样,像往常一样,传入的请求被调度到适当的处理程序方法,例如.get().post()。另外,可以在控制API策略的各个方面的类上设置许多属性。

例如:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions

class ListUsers(APIView):
    """
    View to list all users in the system.

    * Requires token authentication.
    * Only admin users are able to access this view.
    """
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAdminUser,)

    def get(self, request, format=None):
        """
        Return a list of all users.
        """
        usernames = [user.username for user in User.objects.all()]    # 列表解析的方式返回所有用户名
        return Response(usernames)

API策略的属性

以下属性控制了API视图的 the pluggable aspects。

.renderer_classes

.parser_classes

.authentication_classes

.throttle_classes

.permission_classes

.content_negotiation_class

API策略的实例化方法

REST框架使用以下方法来实例化各种可插拔API策略。通常不需要覆盖这些方法。

.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()方法直接调用。这些方法执行任何需要在.get().post()put()patch().delete()等handler methods调用之前或之后发生的操作。

.initial(self,request,* args,** kwargs)

在调用 the handler method之前执行任何需要发生的操作。此方法用于执行权限和限制,并执行内容协商。

通常您不需要覆盖此方法。

.handle_exception(self,exc)

the handler method 抛出的任何异常都将传递给此方法,该方法返回一个Response实例,或重新引发异常。

The default implementation 处理任何 rest_framework.exceptions.APIException的子类,以及Django Http404PermissionDenied异常,并返回适当的错误响应。

如果您需要自定制API返回的错误响应,则应该对此方法进行子类化。

.initialize_request(self,request,* args,** kwargs)

确保传递给handler方法的请求对象是一个 Request的实例,而不是通常的Django HttpRequest

通常您不需要覆盖此方法。

.finalize_response(self,request,response,* args,** kwargs)

确保从 the handler method返回的任何Response对象被渲染为 the content negotiation所确定的正确内容类型。

通常您不需要覆盖此方法。


Function Based Views

CBV不总是最好的解决方案。

尼克·考格兰

REST框架还允许使用常规的FBV。它提供了一组简单的、绑定到FBV的装饰器,以确保它们接收到一个Request实例(而不是通常的Django HttpRequest实例),并允许它们返回Response(而不是Django HttpResponse),还允许您配置请求的处理方式。

@api_view()

签名: @api_view(http_method_names=[‘GET‘], exclude_from_schema=False)

这个功能的核心是api_view装饰器,它提供了一系列视图应该响应的HTTP方法。例如,这是如何编写一个非常简单的、只能手动返回一些数据的视图:

from rest_framework.decorators import api_view

@api_view()
def hello_world(request):
    return Response({"message": "Hello, world!"})

这个视图将使用在settings中指定的、默认的 renderers, parsers, authentication classes等

默认情况下,只接受GET方法。其他方法将以“405 Method Not Allowed”进行响应。要更改此行为,请指定视图允许的方法,如下所示:

@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!"})

You can also mark an API view as being omitted from any auto-generated schema, using the exclude_from_schema argument.:

@api_view([‘GET‘], exclude_from_schema=True)
def api_docs(request):
    ...

API策略装饰器

要覆盖默认设置,REST框架提供了一组其他的可以添加到视图的装饰器。这些装饰器一定要放在的@api_view装饰器的下面。例如,要使用 throttle 创建一个每天只能由特定用户调用一次的视图,请使用@throttle_classes装饰器,passing a list of throttle classes:

from rest_framework.decorators import api_view, throttle_classes
from rest_framework.throttling import UserRateThrottle

class OncePerDayUserThrottle(UserRateThrottle):
        rate = ‘1/day‘

@api_view([‘GET‘])
@throttle_classes([OncePerDayUserThrottle])
def view(request):
    return Response({"message": "Hello for today! See you tomorrow!"})

这些装饰器对应于上面描述的在APIView子类上设置的属性。

可用的装饰器是:

  • @renderer_classes(...)
  • @parser_classes(...)
  • @authentication_classes(...)
  • @throttle_classes(...)
  • @permission_classes(...)

这些装饰器中的每一个都需要一个参数,它必须是列表或元组元素。

时间: 2024-12-18 01:18:06

API Guide(三)之Views的相关文章

Django REST Framework API Guide 03

本节大纲 1.Routers 2.Parsers 3.Renderers Routers Usage from rest_framework import routers router = routers.SimpleRouter() router.register(r'users', UserViewSet) router.register(r'accounts', AccountViewSet) urlpatterns = router.urls register的两个必填参数prefix,

用产品思维设计API(三)——版本控制,没有你想的这么简单

用产品思维设计API(三)--版本控制,没有你想的这么简单 前言 最近公司内部在重构项目代码,包括API方向的重构,期间遇到了很多的问题,不由得让我重新思考了下. - 一个优雅的API该如何设计? - 前后端分离之后,API真的解耦分离了吗? - 不断的版本迭代,API的兼容性该如何做? ps.这里所说的API仅为Web API,提供APP\WEB开发使用. 年前,我司内部的接口已经进入了一个完全的重构阶段,参考了市面上各大平台的API和文档,自己也总结出了很多的心得.这里向大家分享一下,接下来

ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)

在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看另一种验证的方式:digest authentication,即摘要认证. 系列文章列表 ASP.NET Web API(一):使用初探,GET和POST数据ASP.NET Web API(二):安全验证之使用HTTP基本认证ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication) 摘要认证原理 在基本认证的方式中,主

云智慧API监控 三个步骤提高业务增长

云智慧API监控 三个步骤提高业务增长 基于互联网.云计算和移动的应用正变得越来越普及,正在改变着人们的生活和工作方式.越来越多的应用服务封装成一系列的API开放出去供第三方使用,这使应用的开发周期和成本大大减少.游戏.支付.找餐馆.找酒店,移动社交.地理位置等在线服务应用都可以通过API数据接口调用的方式快速获取.因此,应用接口数据服务性能的差异会直接关系到你的业务运营质量.它将提高或减少你的业务收入,或使不满意的用户放弃你而选择你的竞争产品. 不要让第三方或后端服务毁了你的应用性能 Twit

struts2的action访问servlet API的三种方法

学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object get(Object key);可以获取request属性 Map getSession():可以得到session属性 Map getAppliction():可以得到ServletContext实例 2.action类实现 ServletContextAware,ServletRequestAwa

Action访问Servlet API的三种方法

一.为什么要访问Servlet API ? Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试.但是对于Web控制器而言,不访问action是不行的,Struts提供了一种比较简单的方式来访问Servlet API . 二.通常我们需要访问的Servlet API 是 HttpSession.HttpservletRequest.ServletContext,分别对应了JSP内置对象 session,reques

【高德地图API】从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物

覆盖物,是一张地图的灵魂.有覆盖物的地图,才是完整的地图.在一张地图上,除了底层的底图(瓦片图,矢量图),控件(有功能可操作的工具),最重要最不可缺少的就是覆盖物了.覆盖物有多种,包括,标注.折线.多边形.信息窗口.聚合marker.麻点图和图片覆盖物.本文会详细介绍每一种覆盖物的概念,添加方法,修改方法,移除方法等.最后会提供示例和源代码下载. 示例demo:http://zhaoziang.com/amap/zero_3_1.html ----------------------------

HOOK API(三)—— HOOK 所有程序的 MessageBox

HOOK API(三) —— HOOK 所有程序的 MessageBox 0x00 前言 本实例要实现HOOK MessageBox,包括MessageBoxA和MessageBoxW,其实现细节与HOOK API(二)中介绍的基本类似,唯一不同的是,本实例要实现对所有程序的HOOK MessageBox,即无论系统中哪一个程序调用MessageBox都会被重定向到我们实现的新的API中. 之前说过,在Windows中,每个进程都有自己的地址空间,进程不能调用别的进程中的函数.这里涉及到一个关键

【高德地图API】从零开始学高德JS API(三)覆盖物

摘要:覆盖物,是一张地图的灵魂.有覆盖物的地图,才是完整的地图.在一张地图上,除了底层的底图(瓦片图,矢量图),控件(有功能可操作的工具),最重要最不可缺少的就是覆盖物了.覆盖物有多种,包括,标注.折线.多边形.信息窗口.聚合marker.麻点图和图片覆盖物.本文会详细介绍每一种覆盖物的概念,添加方法,修改方法,移除方法等.最后会提供示例和源代码下载. 示例demo:http://zhaoziang.com/amap/zero_3_1.html -------------------------