Class-based Views

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

Reinout van Rees

REST框架提供了一个APIView类,它是Django-View class 的子类。

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

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

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

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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方法。例如,这是如何编写一个非常简单的、只能手动返回一些数据的视图:

1
2
3
4
5
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”进行响应。要更改此行为,请指定视图允许的方法,如下所示:

1
2
3
4
5
@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.:

1
2
3
@api_view(['GET'], exclude_from_schema=True)
def api_docs(request):
    ...

API策略装饰器

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

1
2
3
4
5
6
7
8
9
10
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(...)

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

RESR API (三)之Views的更多相关文章

  1. 用JSON-server模拟REST API(三) 进阶使用

    用JSON-server模拟REST API(三) 进阶使用 前面演示了如何安装并运行 json server , 和使用第三方库真实化模拟数据 , 下面将展开更多的配置项和数据操作. 目录: 配置项 ...

  2. Express4.x API (三):Response (译)

    Express4.x API 译文 系列文章 Express4.x API (一):application (译) -- 完成 Express4.x API (二):request (译) -- 完成 ...

  3. java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))

    1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...

  4. 了解HTML5和“她”的 API (三)

    Web Workers(后台线程) JavaScript是单线程的,较长的javascript运算会阻塞UI线程. web worker 是运行在后台的 JavaScript,不会影响页面的性能. 在 ...

  5. Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作

    1. 滑动和拖拽 我们在做自动化测试的时候,有些按钮是需要滑动几次屏幕后才会出现,此时,我们需要使用代码来模拟手指的滑动,也就是接下来要学的滑动和拖拽了. 1.1 swipe滑动事件 从一个坐标位置滑 ...

  6. 天气预报API(三):免费接口测试(“旧编码”)

    说明 我以参考文章为引子,自己测试并扩展,努力寻找更多的气象API... 本文所有测试均以青岛为例. 本文所列接口城市代码(cityid)参数都使用的 "旧编码": 全国城市代码列 ...

  7. api (三)文本字符输出 (转)

    在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接口(GDI)进行的,Windows的三大核心组件之一的GDI32.dll封装了所有的文本和 ...

  8. Spring Boot 2.x 编写 RESTful API (三) 程序层次 & 数据传输

    用Spring Boot编写RESTful API 学习笔记 程序的层次结构 相邻层级的数据传输 JavaBean 有一个 public 的无参构造方法 属性 private,且可以通过 get.se ...

  9. 005 使用SpringMVC开发restful API三--处理创建请求

    一:主要任务 1.说明 @RequestBody 映射请求体到java方法的参数 日期类型参数的处理 @Valid注解 BindingResult验证请求参数的合法性并处理校验结果 二:@Reques ...

随机推荐

  1. 2019-11-29-git无法pull仓库refusing-to-merge-unrelated-histories

    title author date CreateTime categories git无法pull仓库refusing to merge unrelated histories lindexi 201 ...

  2. 【转】sysctl命令及改变net.ipv4.ip_forward = 1方法

    转自:https://blog.csdn.net/michaelzhou224/article/details/16979285 sysctl配置与显示在/proc/sys目录中的内核参数.可以用sy ...

  3. GPT-2,吓坏创造者的「深度造假写手」

    简评: 今年二月份刷屏的 GPT-2 着实厉害,那个生成续写故事的例子更是效果好到吓人一跳,它到底有多厉害,本文略微讲讲.更详细的信息可参考文末 OpenAI 的博客链接. 你能从下面这两段文字里品味 ...

  4. python爬取百度图片

    import requests import re from urllib import parse import os from threading import Thread def downlo ...

  5. (极值点偏移问题的几种方案)已知$\dfrac{\ln x_1}{x_1}=\dfrac{\ln x_2}{x_2}$,求证:$x_1+x_2>2\text{e}$.

    第一个图适合在手机上操作(点击\(\checkmark\)显示/隐藏) 第二个图适合在电脑上操作(点击\(\checkmark\)显示/隐藏)

  6. jumpserver部署1.0版本

    A. jumpserver概述 跳板机概述: 跳板机就是一台服务器,开发或运维人员在维护过程中首先要统一登录到这台服务器,然后再登录到目标设备进行维护和操作: 跳板机缺点:没有实现对运维人员操作行为的 ...

  7. Python之常用模二(时间、序列号等等)

    一.time模块 表示时间的三种方式: 时间戳:数字(计算机能认识的) 时间字符串:t='2012-12-12' 结构化时间:time.struct_time(tm_year=2017, tm_mon ...

  8. 为什么second是秒也是第二?

    起源 早期在西方,一小时分为 60 分钟.后来,科学发达了.文明进步了,人们认为一分钟太粗放了.必须划分得更细致,于是就把一分钟划分成 60 等分.由于是对时间的第二次划分,就将新的 60 等分的“单 ...

  9. Idea中Springboot热部署无效解决方法

    仅适用IDEA中,eclipse中不需要设置 一.开启idea自动make功能 1 - Enable Automake when the application is running PRESS: C ...

  10. SQL 行转列(列的值不规则的数目)

    --创建一个临时表用来存储数据 create table #tmp_SNValue_Table (FieldName nvarchar(20), [Value] nvarchar(max)) inse ...