2.1 两个视图基类 2.1.1 APIView APIView是drf 提供的所有视图的基类,继承自Django的View父类。...APIView与View的不同之处在于: 传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象; 视图方法可以返回REST framework...在APIView中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法。例如使用APIView简单的实现五个增删查改的API接口。...在试图中可以调用该方法获取详情信息的模型类对象。**若详情访问的模型类对象不存在,会返回404。...除了默认的方法动作外,还可以添加自定义动作。
APIView APIView是Django REST framework提供的所有视图的基类,继承自Django的View类。...使用方式: from rest_framework.views import APIView APIView与View的不同之处在于: 传入到视图方法中的是Django REST framework的Request...对象,而不是Django的HttpRequeset对象; 视图方法可以返回Django REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;(需要...依旧是get方法处理get请求,post方法处理post请求。除此之外,APIView增加了一些可插入的属性。最常用的是下面三个。...其他方法将响应“405 Method Not Allowed”。
rest framework 已经封装好了接口的类,通过导入from rest_framework.views import APIView,继承APIView类,APIView类会自动判断请求的方式...,通过不同的请求(get,post)触发不同的方法,代码如下: from rest_framework.views import APIView from django.http import JsonResponse...from rest_framework import status import hashlib import base64 class CeShi(APIView): def dispatch...(self, request, *args, **kwargs): """ 请求到来之后,都要执行dispatch方法,dispatch方法根据请求方式不同触发 get/...b64encode(s.encode("utf-8")).decode('utf-8') return token postman截图效果: 可以看到http请求的状态码变成401,验证错误
'''views.py''' from rest_framework.views import APIView from rest_framework.response import Response...APIView的执行流程 # 同样和Django中一样写一个视图类,只不过DRF中用APIView底层还是View '''views.py''' from rest_framework.response...中找,这次不需要和Django一样去View中找了,庆幸的是APIView中有as_view方法,核心源码如下: @classmethod def as_view(cls, **initkwargs...,是APIview所以执行的dispatch是APIView中的dispatch方法 5、dispatch方法中包装了新的Request对象,以后视图类中的方法传入的request都是新的,无论三大认证还是视图函数的方法...# 如果用过新包装过的request来调用原来的方法呢?
APIView 是 Django REST Framework (DRF) 中提供的基础视图类,继承自 Django 的 View 类,但针对 RESTful API 进行了扩展。...异常处理:统一捕获 API 异常,返回结构化的错误响应。二、为什么要使用 APIView?...代码更简洁:通过重写 get(), post() 等方法实现不同 HTTP 方法逻辑,符合 REST 规范。三、基础用法1....:这实际上是 GenericAPIView 的属性,不是基础 APIView 的属性重要方法APIView 还有一些可以重写的重要方法:initial(self, request, *args, **kwargs...""" 在处理请求前执行初始化操作 """ # 调用父类的 initial 方法 super().initial(request, *args,
,支持POST、PUT、PATCH方法 Response DRF的Response继承自Django的django.template.response.SimpleTemplateResponse: ?...@api_view和APIView DRF对API视图做了2个封装: @api_view用于函数视图。 APIView用于类视图。...它们提供了一些新功能,比如: 检查请求是Request对象 添加上下文到Response对象 返回请求错误如405 Method Not Allowed 当request.data格式有误时,抛出ParseError...当然,会技术是个大前提,对技术的学习不能停,比如Django REST framework。...参考资料: https://www.django-rest-framework.org/tutorial/2-requests-and-responses/
# 简介 本文介绍的是 django rest_framework的认证方式. Token、Session、RemoteUser、jwt等认证方式。...ApiView继承Django的View,然后调用View.as_view 在View中调用dispatch方法,因为ApiView实现dispatch方法,所以调用的是ApiView.dispatch...在ApiView.dispatch中将django.request再次封装成框架的rest_framework.request 封装的过程中将配置的Authentication类注入到request..._authentication进行循环遍历所有注入的Authentiation类中authenticate方法进行认证,认证成功则返回user和auth两个结果 # 认证方式 可以自定义认证类,只需要继承...在TestView添加TokenAuthentication认证, 路由到TestView时,会调用该类中的authenticate方法,通过token获取到user. view.py from rest_framework.authentication
分析源码 通过分析源码了解权限组件的方法调用过程 APIView 的 dispatch 中使用 initial 方法实现初始化并进行三大认证,第二步进行权限组件调用 rest_framework/views.py...rest_framework.views import APIView from rest_framework.generics import GenericAPIView from rest_framework.viewsets...二、自定义权限类 1....代码实现 继承 BasePermission 重写 has_permission 方法 实现根据自定义权限规则,确定是否有权限 认证规则: 满足设置的用户条件,代表有权限,返回...无认证信息,或有错误认证信息,无写权限 ? 无认证信息,有读权限 ?
配置的一堆认证类产生的认证类对象组成的 list for authenticator in self.authenticators: try: # 认证器(对象)调用认证方法...在api目录下创建authentications.py文件 ## 自定义认证类 # 1.继承BaseAuthentication # 2.重写authenticate(self,request)方法...import APIView from rest_framework.generics import GenericAPIView from rest_framework.viewsets import...import APIView from rest_framework.generics import GenericAPIView from rest_framework.viewsets import...__init__() 方法) # 2)频率认证类对象调用 allow_request 方法,判断是否限次(没有限次可访问,限次不可访问) # 3)频率认证类对象在限次后,调用 wait
的as_view函数 2) 在APIView的as_view调用父类(django原生)的as_view,还禁用了 csrf 认证 3) 在父类的as_view中dispatch分发请求走的又是APIView...的dispatch 4) 完成任务方法交给视图类的请求函数处理,得到请求的响应结果,返回给前台 """ 请求模块 ---- 源码入口 APIView类的dispatch方法中:request = self.initialize_request...中,所有数据包数据都被解析到data中 渲染模块 浏览器和Postman请求结果渲染数据的方式不一样 ---- 源码入口 APIView类的dispatch方法中:self.response = self.finalize_response...(as_view)禁用csrf => View(as_view)=> APIView(dispatch) => 视图类的请求方法 => 响应 请求模块 request完全兼容_request...(局部) => APIView视图类 => 自定义drf配置(全局) => drf默认配置 """
',namespace='rest_framework')), ] image.png 1、基本视图类-类基础视图(APIView) 不同于django常规的view类,优点: * 提供了更好用的request...(self, request, *args, **kwargs): 执行任何操作,需要发生在处理程序方法之前被调用。...通常默认只有GET方法,其他请求方法会报405错误,我们可以手动添加方法为这装饰器指定request方法。...ViewSet同样不提供具体行为方法的实现,可以重写和定义一些请求处理方法。 而代替了原来APIVIew的POST,GET等方法,取而代之的是list,create等方法。...list()和retrieve() 自定义View类:只需要继承GenericAPIView, 增加mixins的相关处理方法。
默认情况下, REST framework 的 APIView 类或者 @api_view 装饰器将捕获错误并返回 400 Bad Request 响应。...标准的 HttpRequest 属性 由于 REST framework 的 Request 扩展于 Django 的 HttpRequest,所有其他标准属性和方法也可用。....status_code 状态码 .content 将会返回的响应内容,必须先调用 .render() 方法,才能访问 .content 。...响应内容将设置为在 accepted_renderer 实例上调用 .render(data,accepted_media_type,renderer_context) 方法的结果。...通常不需要自己调用 .render() ,因为它是由 Django 处理的。
下面是一个pre_save信号和post_save信号的示例:from django.dispatch import receiverfrom rest_framework import signalsfrom...下面是一个pre_delete信号和post_delete信号的示例:from django.dispatch import receiverfrom rest_framework import signalsfrom...五、其他信号类型除了上述常用的信号类型外,Django REST Framework还提供了其他类型的信号,如APIView的信号、ModelViewSet的信号等。...下面是一个APIView的信号的示例:from django.dispatch import receiverfrom rest_framework import signalsfrom rest_framework.views...当APIView收到请求时,log_request函数将被调用。在log_request函数中,我们可以记录请求路径、请求方法、请求参数等信息。
conneg.select_renderer(request, renderers, self.format_kwarg) # 在根据 request 请求的方式再选择具体是选择哪种渲染方式,然后再调用某个方法...__init__ 方法实例化 self.renderer_classes 来源 class APIView(View): # self.renderer_classes 取到的即是配置中的 DEFAULT_RENDERER_CLASSES...from django.utils.module_loading import import_string from rest_framework import ISO_8601 DEFAULTS...如何自定义配置使用渲染类 得知我们可以在自己的 settings 文件中这样来配置它的解析类(全局配置) REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES...(局部) => APIView 视图类 => 自定义 drf 配置(全局) => drf 默认配置 自定义渲染模块 视图类 from rest_framework.renderers import
序列化器支持三种类型: **Serializer:**对Model(数据模型)进行序列化,需自定义字段映射。...import APIView from rest_framework.response import Response class UserApiView(APIView): def get...import APIView from rest_framework.response import Response class UserApiView(APIView): def get....data获取数据 -> 响应返回前端 反序列化(写数据):视图获取前端提交的数据 -> 数据传入序列化器 -> 调用序列化器的.is_valid方法进行效验 -> 调用序列化器的.save()方法保存数据...序列化器常用方法与属性: serializer.is_valid():调用序列化器验证是否通过,传入raise_exception=True可以在验证失败时由DRF响应400异常。
,但是视图类没有该方法,所以请求走的是APIView的as_view方法 在APIView的as_view调用父类(django原生View)的as_view,同时还禁用了 csrf 认证 在父类(...django原生View)的as_view中dispatch方法请求走的又是APIView的dispatch #因为APIView也可以走dispatch,视图类是先继承APIView,APIView...中没有再去原生View中 完成任务方法交给视图类的请求函数处理,得到请求的响应结果, 返回给前台所以以后直接就从APIView的dispatch入口看源码 请求模块:request对象 1) drf...'rest_framework.renderers.JSONRenderer', #只显示出json数据 'rest_framework.renderers.BrowsableAPIRenderer...', #渲染出页面,注意是BrowsableAPIRenderer ], } 自定义局部配置:某一个或一些实体类单独处理,在views.py视图类中提供对应的类属性 # 在setting.py
分析源码 通过分析源码了解认证组件的方法调用过程 APIView 的 dispatch 中使用 initial 方法实现初始化并进行三大认证,第一步就是认证组件 rest_framework/views.py...user 方法属性 request.user request.user 去 request 中找 user 方法属性,找到认证方法实现过程 rest_framework/request.py...try 包裹,代表该方法会抛异常,抛异常代表认证失败 try: # 认证器(对象)调用认证方法 authenticate(认证类对象self,request...', 'rest_framework.authentication.BasicAuthentication' ], } 根据这个,现在就可以自定义项目配置文件 2....APIView from rest_framework.generics import GenericAPIView from rest_framework.viewsets import GenericViewSet
from rest_framework.views import APIView from rest_framework.viewsets import ViewSet from rest_framework.response...import url from django.contrib import admin from . import views,views_apiview,views_genericapivie,views_mixinview...from rest_framework.views import APIView from rest_framework.viewsets import GenericViewSet from rest_framework.generics...import url from django.contrib import admin from . import views,views_apiview,views_genericapivie,views_mixinview...此扩展方法包括:get_serializer_class(获取序列化器返回)、action属性、自定义方法的使用 from django.db import DatabaseError from rest_framework.authentication
APIview的请求生命周期源码分析 Django项目启动=>加载settings文件=>加载models、views、urls文件,执行urls文件,调用视图类的as_view()方法。 ?...,如果没有就去基类APIview里面查找,APIview的dispatch方法是对view类的dispatch方法的重写,对view类的dispatch方法进行了优化,具体优化一起来看APIview的dispatch...initial对请求进行三大认证,并在这个过程中进行异常捕获 3.通过反射的方法执行通过认证的自定义请求如get、post、patch、delete等 4.如果上面2、3步执行过程中有异常,就调用handle_exception...以上就是Django rest framework源码的请求流程,下面我们粗略看一下请求模块、解析模块、相应模块、异常处理模块、渲染模块的源码。...'rest_framework.parsers.MultiPartParser'#文件 form-data ], #这里是全局配置,我们可以在项目的settings文件中自定义配置我们使用的解析器
/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response...基于主机名方法 如:v1.example.com ALLOWED_HOSTS = ['*'] REST_FRAMEWORK = { 'DEFAULT_VERSION': 'v1', # 默认版本...luffy.com 127.0.0.1 v2.luffy.com #配置ALLOWED_HOSTS = ['*'] 如果遇到这样的错误...自定义字段 from django.conf.urls import url, include from web.views.s6_serializers import TestView urlpatterns...ser = UsersSerializer(instance=user,many=True) 19 20 return Response(ser.data) 3、复杂序列化 自定义类和方法