APIView
REST framework提供了一个 APIView 类,它是Django的 View 类的子类。
APIView 类和Django原生的类视图的 View 类有以下不同:
传入的请求对象不是Django原生的 HttpRequest 类的实例,而是REST framework的Request 类的实例。
视图返回的是REST framework的 Response 响应,而不是Django的 HttpResponse 。视图会管理内容协商的结果,给响应设置正确的渲染器
 
 
任何 APIException 异常都会被捕获,并且传递给合适的响应。
请求对象会经过合法性检验,权限验证,或者阈值检查后,再被派发到相应的视图。
使用 APIView 类和使用一般的 View 类非常相似,通常,进入的请求会被分发到合适的处理
APIView的所有属性和方法:
allowed_methods
as_view
authentication_classes
check_object_permissions
check_permissions
check_throttles
content_negotiation_class
default_response_headers
determine_version
dispatch
finalize_response
get_authenticate_header
get_authenticators
get_content_negotiator
get_exception_handler
get_exception_handler_context
get_format_suwix
get_parser_context
get_parsers
get_permissions
get_renderer_context
get_renderers
get_throttles
get_view_description
get_view_name
handle_exception
http_method_names
http_method_not_allowed
initial
initialize_request
metadata_class
options
parser_classes
perform_authentication
perform_content_negotiation
permission_classespermission_denied
raise_uncaught_exception
renderer_classes
schema
settings
setup
throttle_classes
throttled
versioning_class
API视图的属性
.renderer_classes  #渲染器
.parser_classes # 解析器
.authentication_classes #认证器
.throttle_classes #限流器
.permission_classes #权限
.content_negotiation_class #内容协商
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()
下面这些方法会被视图的 .dispatch() 方法直接调用。它们在调用 .get , .post() , put() , patch() 和 delete() 之类的请求处理方法之前或者之后执行任何需要执行的操作。
.initial(self, request, *args, **kwargs)
在处理方法调用之前进行任何需要的动作。 这个方法用于执行权限认证和限制,并且执行内容
协商,通常不需要重写此方法。
.handle_exception(self, exc)
任何被处理请求的方法抛出的异常都会被传递给这个方法,这个方法既不返回 Response 的实例,也不重新抛出异常。
默会处理 rest_framework.expceptions.APIException 的子类异常,以及Django的Http404 和
PermissionDenied 异常,并且返回一个适当的错误响应。
如果你需要在自己的API中自定义返回的错误响应,你可以重写这个方法。
.initialize_request(self, request, *args, **kwargs)
这个方法确保传递给视图的请求对象是 Request 的实例,而不是原生的
Django HttpResquest 的实例。通常不需要重写这个方法。
.finalize_response(self, request, response, *args, **kwargs)
确保任何从处理请求的方法返回的 Response 对象被渲染到由内容协商决定的正确内容类型。
通常不需要重写这个方法。
@api_view()
在REST framework中,也可以使用常规的基于函数的视图。DRF提供了一组简单的装饰器,用
来包装你的视图函数,以确保视图函数会收到 Request (而不是Django原生的
HttpRequest )对象,并且返回 Response (而不是Django的 HttpResponse )对象,同时
允许你设置这个请求的处理方式。
@api_view()装饰器
签名: @api_view(http_method_names=['GET'], exclude_from_schema=False)
api_view 装饰器的主要参数是响应的HTTP方法的列表。 比如,你可以像这样写一个返回一
些数据的非常简单的视图。
这个视图会使用settings中指定的默认的渲染器,解析器,认证类等等。
默认的情况下,只有 GET 请求会被接受。其他的请求方法会得到一个"405 Method Not
Allowed"响应。可以像下面的示例代码一样改变默认行为:
API 访问策略装饰器
REST framework提供了一组可以加到视图上的装饰器来重写一些默认设置。这些装饰器必须放
在 @api_view 装饰器的后 (下)面。比如,要创建一个使用限制器确保特定用户每天只能调用
一次的视图,可以用 @throttle_classes 装饰器并给它传递一个限制器类的列表。
from rest_framework.decorators import api_view
@api_view()
def hello_world(request):
return Response({"message": "Hello, world!"}) @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!"})
这些装饰器和前文中的 APIView 的子类中设置的属性相对应。
可用的装饰器有:
@renderer_classes(...)
@parser_classes(...)
@authentication_classes(...)
@throttle_classes(...)
@permission_classes(...)
这些装饰器都只接受一个参数,这个参数必须是类的列表或元组。
视图模式装饰器
要重写默认的基于函数的视图生成的模式,你需要使用 @schema 装饰器。它必须放在
@api_view 装饰器后面,例如:
如果给装饰器传递一个 None 参数值,那么会将函数排除在模式生成之外。
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!"}) from rest_framework.decorators import api_view, schema
from rest_framework.schemas import AutoSchema
class CustomAutoSchema(AutoSchema):
def get_link(self, path, method, base_url):
# override view introspection here...
@api_view(['GET'])
@schema(CustomAutoSchema())
def view(request):
return Response({"message": "Hello for today! See you tomorrow!"}) @api_view(['GET'])
@schema(None)
def view(request):
return Response({"message": "Will not appear in schema!"})

21.drf视图系统组成及继承关系的更多相关文章

  1. drf:restful概念,类继承关系,drf请求封装,drf请求流程,版本控制组件,认证组件(token),权限组件

    1.restful规范 resfful规范的概念最重要: 是一套规范,规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,rest ...

  2. C++类继承关系视图的自动生成

    原创文章,转载请注明出处. 工欲善其事,必先利其器.阅读大型C++工程项目,如果有一些自动化的分析工具支持,学习的效率将大大提升.在前文中介绍了Source Insight在Linux下的安装方法,本 ...

  3. C#继承关系中【方发表】的创建和调用

    —C#继承关系中[方发表]的创建和调用 Insus.NET实现一个最炫最原创的验证码.你可以从下面的一步一步的演译. 实现一个验证码,需要了解的是,它最基本是随机产生字符串:<在ASP.NET ...

  4. restfull规范、DRF视图和路由

    一.restfull规范的简单介绍 1.介绍 REST:表述性状态转移,是一种web交互方案 资源:在web中只要有被引用的必要都是资源 URI: URI 统一资源标识符 URL 统一资源定位符 统一 ...

  5. Python rest-framework 中类的继承关系(as_view)

    一. 背景 最近几天一直在学习restful framework的源代码,用户请求的流程,在路由系统这块遇到一个疑问,关于类的继承关系,当请求进来到路由这块,执行as_view()方法的时候,为什么会 ...

  6. Style在Android中的继承关系

    Style在Android中的继承关系 Android的Styles(样式)和Themes(主题)非常类似Web开发里的CSS,方便开发者将页面内容和布局呈现分开.Style和Theme在Androi ...

  7. drf 视图使用及源码分析

    前言 drf视图的源码非常的绕,但是实现的功能却非常的神奇. 它能够帮你快速的解决ORM增删改查的重复代码,非常的方便好用. 下面是它源码中的一句话: class ViewSetMixin: &quo ...

  8. 对象的继承关系在数据库中的实现方式和PowerDesigner设计

    原文:对象的继承关系在数据库中的实现方式和PowerDesigner设计 在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统RDBMS中,使用的是外键表示实体(表)之间的 ...

  9. JavaSE复习日记 : 继承关系和super关键字以及继承关系中方法的覆写

    /* * 类的继承和super关键字 * * 软件开发的三大目的: * 可拓展性; * 可维护性; * 可重用性; * * 这里单说下可重用性这一项: * 为了代码复用,复用方式有: * 函数的调用复 ...

随机推荐

  1. 重构、插件化、性能提升 20 倍,Apache DolphinScheduler 2.0 alpha 发布亮点太多!

    点击上方 蓝字关注我们 社区的小伙伴们,好消息!经过 100 多位社区贡献者近 10 个月的共同努力,我们很高兴地宣布 Apache DolphinScheduler 2.0 alpha 发布.这是 ...

  2. Spring 01 概述

    简介 Spring 是开源的轻量级 J2EE 框架 我们常说的 Spring 实际上是指 Spring Framework,它是 Spring 家族中的一个重要分支. 官方文档 https://doc ...

  3. java-注释、API之字符串(String)

    /** * 文档注释只定义在三个地方 : 类.常量.方法上 * 在类上定义文档注释用来说这个类设计及其解决问题等相关描述信息 * @author 作者 * @version  1.0 21/08/17 ...

  4. es5 es6 新增

    es5的新特性 对于数组和字符串都进行了加强 map 遍历 es6的新特性 数组的增强 find 查找findIndex 查找下标 字符的增强 includes 是否包含 (包含返回true 不包含返 ...

  5. CSS 布局(一):Flex 布局

    主轴和纵轴 对某一盒子模型添加display: flex;属性后,称之为 Flexible Box 模型(或称之为 flexbox),即弹性盒子模型,简称弹性盒子. 弹性盒子为子元素提供了强大的空间分 ...

  6. 上传代码到GitHub仓库

    上传代码到GitHub仓库 准备工作 意思是自从 21 年 8 月 13 后不再支持用户名密码的方式验证了,需要创建个人访问令牌(personal access token). 这里就不多说了 Git ...

  7. Linus命令

    参考: https://blog.csdn.net/weixin_44191814/article/details/120091363 vim编辑器 ## Vim基本模式 [对文件进行操作]vim 文 ...

  8. noip 2014 提高组初赛

    noip 2014 提高组初赛 一. TCP协议属于哪一层协议( ) A. 应用层 B. 传输层 C. 网络层 D. 数据链路层 B TCP(传输控制协议) 若有变量int a; float: x, ...

  9. JS 模块化 - 03 AMD 规范与 Require JS

    1 AMD 规范介绍 AMD 规范,全称 Asynchronous Module Definition,异步模块定义,模块之间的依赖可以被异步加载. AMD 规范由 Common JS 规范演进而来, ...

  10. kibana配置文件kibana.yml参数详解

    server.port: 默认值: 5601 Kibana 由后端服务器提供服务,该配置指定使用的端口号. server.host: 默认值: "localhost" 指定后端服务 ...