django---APIView源码分析
django---APIView源码分析
前言:APIView基于View 看这部分内容一定要懂django—CBV里的内容
在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程
这篇博客我们就来了解下APIView是如何执行的,跟django.views模块下的view有何关联?
我们依然从urls.py配置入手分析
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^publishes/', views.PublishView.as_view()),
]
views.py
from rest_framework.views import APIView
class PublishView(APIView):
def get(self,request):
publish_list=Publish.objects.all()
ret=serialize("json",publish_list)
return HttpResponse(ret)
def post(self,request):
pass
1、首先我们还是来确认urls.py中as_view是谁执行的?
首先我们去views.PublishView中找,发现找不到,所以我们接着再去PublishView的父类APIView中去找,找到了所以执行调用APIView.as_view(),内容如下:
class APIView(View):
# 多余的代码暂且删掉了
@classmethod
def as_view(cls, **initkwargs):
if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
def force_evaluation():
raise RuntimeError(
'Do not evaluate the `.queryset` attribute directly, '
'as the result will be cached and reused between requests. '
'Use `.all()` or call `.get_queryset()` instead.'
)
cls.queryset._fetch_all = force_evaluation
# 1. super调用父类的as_view的执行结果赋值给view这个变量
view = super(APIView, cls).as_view(**initkwargs)
view.cls = cls
view.initkwargs = initkwargs
# Note: session based authentication is explicitly CSRF validated,
# all other authentication is CSRF exempt.
# csrf_exempt 不在执行调用csrf_token那个中间件
# 中间件是针对全局的
# 2. 这里返回的view就是父类View.view
return csrf_exempt(view)
2、大家是不是以为这样就结束了?NO!NO!NO!
如果是as_view是View的as_view,dispatch是View的dispatch,那rest-framework不就成废钞了么?
as_view的执行结果是dispatch的执行结果,那么dispatch还是View的dispatch么?
- 我们先看下views.PublishView里边有没有dispatch,发现没有
- 我们在views.PublishView的父类APIView,发现有
- 所以dispatch是APIView.dispatch非View.dispatch
- APIView.dispatch 里边有一堆组件,这里不说
中间的这点代码跟之前的View.dispatch一样:
还是做请求分发,在请求之外又做了一堆事情
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
response = handler(request, *args, **kwargs)
总结:
url 转变过程
- url(r'^publishes/', views.PublishView.as_view()),
- url(r'^publishes/', APIView.as_view()),
- url(r'^publishes/', View.as_view()),
View.as_view()我们在django—CBV讲解过了
所以最后调用还是,只是APIView.as_view在里边加了一些他自己定义的一些东西,只是我们没用到而已
APIView.as_view()---> View.as_view()---> APIView.dispatch()--->response--->handler()--> 自己定义请求方法函数的返回结果,否则就抛错405
django---APIView源码分析的更多相关文章
- $Django cbv源码分析 djangorestframework框架之APIView源码分析
1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...
- django Rest Framework----APIView 执行流程 APIView 源码分析
在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...
- Django rest framework框架——APIview源码分析
一.什么是rest REST其实是一种组织Web服务的架构,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP.其目标是为了创建具有良好扩展性的分布式系统. 可用一句话 ...
- CBV源码分析+APIVIew源码分析
{drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...
- Restful规范-APIView源码分析
目录 一.Restful规范 十条规范 二.drf的简单使用 三.APIView源码分析 CBV源码分析 APIView源码分析 一.Restful规范 Restful规范是一种web API接口的设 ...
- cbv+resful+APIView源码分析
CBV源码分析 1概念:什么是cbv和fbv 已经什么是API class bass View ---基于类的视图 function bass View ---基于函数的视图 API(Applicat ...
- 探索drf执行流程之APIView源码分析
Django REST framework 简介 现在新一代web应用都开始采用前后端分离的方式来进行,淘汰了以前的服务器端渲染的方式.而实现前后端分离是通过Django REST framework ...
- Django APIView源码解析
APIView使用:luffy项目中关于APIView的使用 在Django之 CBV和FBV中,我们是分析的from django.views import View下的执行流程,以下是代码 fro ...
- drf的基本使用、APIView源码分析和CBV源码拓展
cbv源码拓展 扩展,如果我在Book视图类中重写dispatch方法 -可以实现,在get,post方法执行之前或者之后执行代码,完成类似装饰器的效果 def dispatch(self, requ ...
- django --- DetailView源码分析
[背景] 最近在看django官方文档的class-based-views这一节的时候一直不得要领,感觉自己清楚,但是回想起来又没有脉络:于是没有办法只 能是“暗中观察”django的源码了. 刚打开 ...
随机推荐
- Linux mount 命令
mount 命令用来挂载文件系统.其基本命令格式为:mount -t type [-o options] device dirdevice:指定要挂载的设备,比如磁盘.光驱等.dir:指定把文件系统挂 ...
- C_运算符_逻辑表达式
// 除法取余运算符的例子 //2018年9月19日22:44:21 # include<stdio.h> int main(void) { printf(%, %-, -%, -%-, ...
- 701 C. They Are Everywhere
链接 [http://codeforces.com/group/1EzrFFyOc0/contest/701/problem/C] 题意 给你一个包含大小写字母长度为n的字符串,让你找包含所有种类字符 ...
- ELF分析 实践
分析ELF文件: 首先编写一个.c文件,并使用gcc -c xx.c -o xx.o 对其进行编译. 我在这个实践中是ELF_1.o文件. 接下来输入ls -l ELF_1.o 查看重定位文件的信息. ...
- shell脚本--显示文本内容
shell脚本显示文本内容及相关的常用命令有cat.more.less.head.tail.nl 首先是cat,cat最常用的就是一次性显示文件的所有内容,如果一个文件的内容很多的话,那么就不是很方便 ...
- PAT 1021 个位数统计
https://pintia.cn/problem-sets/994805260223102976/problems/994805300404535296 给定一个k位整数N = d~k-1~*10^ ...
- IIS7开启gZip动态压缩
1.安装动态压缩模块: 安装过程可能的报错:This application has requested the Runtime to terminate it in an unusual way. ...
- [工作相关] GS产品使用LInux下Oracle数据库以及ASM存储时的数据文件路径写法.
1. 自从公司的GS5版本就已经支持Linux下的oracle数据库通过安装工具自动安装注册了, 只不过路径需要使用linux的命名规则, 如图: /home/oracle/ 注意 最后是有一个 斜线 ...
- Node params和query的Get请求传参
//1:加载http express框架//2:创建服务器const http = require("http");const express = require("ex ...
- hadoop集群故障排除
故障一:某个datanode节点无法启动 我是以用户名centos安装和搭建了一个测试用的hadoop集群环境,也配置好了有关的权限,所有者.所属组都配成centos:centos [故障现象] 名称 ...