RESR API (三)之Views
Class-based Views
Django's class-based views are a welcome departure from the old-style views.
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 APIViewfrom rest_framework.response import Responsefrom rest_framework import authentication, permissionsclass 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 Http404和PermissionDenied异常,并返回适当的错误响应。
如果您需要自定制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_classesfrom rest_framework.throttling import UserRateThrottleclass 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的更多相关文章
- 用JSON-server模拟REST API(三) 进阶使用
用JSON-server模拟REST API(三) 进阶使用 前面演示了如何安装并运行 json server , 和使用第三方库真实化模拟数据 , 下面将展开更多的配置项和数据操作. 目录: 配置项 ...
- Express4.x API (三):Response (译)
Express4.x API 译文 系列文章 Express4.x API (一):application (译) -- 完成 Express4.x API (二):request (译) -- 完成 ...
- java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))
1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...
- 了解HTML5和“她”的 API (三)
Web Workers(后台线程) JavaScript是单线程的,较长的javascript运算会阻塞UI线程. web worker 是运行在后台的 JavaScript,不会影响页面的性能. 在 ...
- Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作
1. 滑动和拖拽 我们在做自动化测试的时候,有些按钮是需要滑动几次屏幕后才会出现,此时,我们需要使用代码来模拟手指的滑动,也就是接下来要学的滑动和拖拽了. 1.1 swipe滑动事件 从一个坐标位置滑 ...
- 天气预报API(三):免费接口测试(“旧编码”)
说明 我以参考文章为引子,自己测试并扩展,努力寻找更多的气象API... 本文所有测试均以青岛为例. 本文所列接口城市代码(cityid)参数都使用的 "旧编码": 全国城市代码列 ...
- api (三)文本字符输出 (转)
在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接口(GDI)进行的,Windows的三大核心组件之一的GDI32.dll封装了所有的文本和 ...
- Spring Boot 2.x 编写 RESTful API (三) 程序层次 & 数据传输
用Spring Boot编写RESTful API 学习笔记 程序的层次结构 相邻层级的数据传输 JavaBean 有一个 public 的无参构造方法 属性 private,且可以通过 get.se ...
- 005 使用SpringMVC开发restful API三--处理创建请求
一:主要任务 1.说明 @RequestBody 映射请求体到java方法的参数 日期类型参数的处理 @Valid注解 BindingResult验证请求参数的合法性并处理校验结果 二:@Reques ...
随机推荐
- C# wpf 使用资源文件 resx
随意新建一个wpf应用 在cs代码编辑,增加 using System.Resources; 放在最上 在方案新建文件夹 名 文件 在 文件 新建资源文件 资源.resx 资源.resx 添加字符串 ...
- SpringMVC基础01——SpringMVC的知识结构体系
1.前言 目前在各大互联网公司使用最热门的技术莫过于SpringBoot以及在其基础之上的SpringCloud,然而学习这些技术的基础在于学好Spring和SpringMVC,准确来说SpringM ...
- MYSQL explain详解[转载]
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 虽然这篇文章我写的很长,但看起来真的不会困啊,真的都是干货啊!!!! 先解析 ...
- SpringMVC @RequestMapping注解详解
@RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) pa ...
- ZROI 19.08.02 计算几何
1.向量基础知识 \(atan2\)可以求极角,但是不是特别精确,在坐标接近\(10^{9}\)时会出锅,安全的做法是叉积. 旋转.反射和平移等都可以抽象为矩阵,即,它们可以复合.(需要一些必修四知识 ...
- Modbus软件开发实战指南 之 开发自己的Modbus Poll工具 - 3
Modbus-RTU 一.数据分析 两个设备(单片机)通讯,用的是Modbus协议. 在单片机中拿出一部分内存(RAM)进行两个设备通讯,例如: 说明: OX[20] 代表是 ...
- 为什么要用setTimeout模拟setInterval ?
setInterval有两个缺点: 使用setInterval时,某些间隔会被跳过: 可能多个定时器会连续执行: 在前一个定时器执行完前,不会向队列插入新的定时器(解决缺点一) 保证定时器间隔(解决缺 ...
- 那些10w+的公众号都在写什么?
出于好奇,那些10w+的公众号都写了些什么,于是我写了几个脚本爬取了各行业Top的公众号文章,进行了关键词统计. 抓取数据.分析用到了3中语言:Node.js,Java,Python.废话不多说,直接 ...
- Codeforces 912D Fishs ( 贪心 && 概率期望 && 优先队列 )
题意 : 给出一个 N * M 的网格,然后给你 K 条鱼给你放置,现有规格为 r * r 的渔网,问你如果渔网随意放置去捕捞小鱼的情况下,捕到的最大期望值是多少? 分析 : 有一个很直观的想法就是 ...
- CDOJ 1063 堆排序模板
D - 秋实大哥与妹纸 Time Limit:1000MS Memory Limit:1500KB 64bit IO Format:%lld & %llu Submit Sta ...