CBV 执行流程

  路由配置:url(r'^test/',views.Test.as_view()),  --> 根据路由匹配,一旦成功,会执行后面函数(request) --> 本质就是执行了as_view内部的view函数 --> 内部又调用了self.dispatch --> 根据请方式,执行不同的方法(必然get请求,就会执行视图类的get方法)

  自己分装一个类 重写dispatch方法,在执行父类的dispatch之前,写一些逻辑,请求来了,就会执行这些逻辑

from django.views import View
class APIView(View):
def dispatch(self, request, *args, **kwargs):
# 写控制条件
ret = super().dispatch(request,*args,**kwargs)
return ret class Test(APIView):
def get(self,request,*args,**kwargs):
return HttpResponse('ok收到了了')
restful规范

面向资源架构 10条

  1 API与用户的通信协议,总是使用HTTPs协议   这个协议比HTTP协议更安全一些

  2 域名有区分  ① https://api.example.com  @https://example.com/api/   两种书写方式

  3 版本  可以放在路径中  可以放在请求头中

    https://api.example.com/v1/

  4 路径,是网络上任何东西都是资源,均使用名词表示(重点)

    https://api.example.com/imgs

  5 通过method 区分是什么操作(重点)

    get 表示获取

    post 提交数据表示新增

    delete表示删除

    patch/put  表示修改

  6 过滤,通过在url上传参的形式传递搜索条件  是查询所有 还是某一个分类或标签下的某一个资源

  7 状态码

    {'code' :100}

  8 信息处理,错误处理应返回错误信息

    {'code':101,'msg':'用户名或密码错误'}

     {'code':100,'msg':'登录成功'}

  9 返回结果,针对不同操作,服务器像用户返回的结果

    get请求的获取所有资源  127.0.0.1/api/v1/books  获取所有图书  {'code':100,'msg':'success',data:[{},{},{}]}

    get获取一个资源    127.0.0.1/api/v1/books/3  获取id为3的图书  {'code':100,'msg':'success',data:{'name':'小右'}}

    新增数据,把新增的数据再返回

    修改了数据,返回完整的资源对象

    删除数据,返回一个空文档

  10 返回结果中提供链接

基于原生django开发restful的接口

写获取图书接口  前端不用用queryset  用json转成字符串

JsonResponse 默认是传送字典类型  想要传送非字典类型需要设置safe=False   中文会被JsonResponse按照ascii编码

def lide(request):
if request.method == 'GET':
books = models.Book.objects.all()
# 列表推导式
l = [{'name': book.name, 'publish': book.publish} for book in books]
res = {'code': 100, 'msg': '查询成功', 'data': l} # 把它发回前端
return JsonResponse(res, safe=False, json_dumps_params={'ensure_ascii': False})

源码

drf:APIView的源码,Request的源码

安装:  pip3 install djangorestframework  第二种是pycharm安装

使用:  第一步,在写视图,都写cbv

from rest_framework.views import  APIView
class Books(APIView):
def get(self,request):
'''
request是被封装后的request,原生的request在requeset._rquest
如果想要用用原生的request中的属性,还是原来的用法,因为Request重写了__getattr__方法
原生django只能处理urlencoded和formdata编码,如果是jason格式,原生django是不能处理的,需要自己从body中自行处理的 也就是前面说的
只有json才可以看body request.data 不管前端传输的编码格式是urlencoded,formdata或者json,都是从里面取值 request.data
request.query_params 是原来django原生的GET中的数据
self.FILES 就是上传的文件
:param request:
:return:
''' dic={'name':'lqz','age':30,'height':178,'wife':['liuyifei','dilireba','langlixiaobailong']} return JsonResponse(dic)

在settings文件中配置  INSTALLED_APPS=[...,'rest_framework']

源码分析:

  继承了APIView之后   

    1所有的请求都没有csrf的认证了  

    忽略校验

    2 在APIView中as_view本质上还是调用了父类的as_view(View的as_view)

    3 as_view中调用dispath  --> 这个dispatch是APIView的dispatch(先从自身查找没有找父类APIView的找到dispatch)

APIView的dispatch方法:

  

  1 对原生request对象做了一层装(面向对象的封装),以后再用的request对象是新的request对象

原生request对象里面有个GET(以get形式提交的数据)都拆到environ内部 django把数据取出来转成了QueryDict的对象

看具体怎么封装的打印一下request._request的类型拿到类之后from impot点击进入

QueryDict对象 GET方法上面的装饰器可能是个缓存的装饰器 不然每次都实例化一个QueryDict对象浪费资源

  

session不是原生requeset对象的属性,在中间件中放进去的(django.contrib.sessions.middleware.SessionMiddleware)  

  2 在APIView中self.initial(request,*args,**kwargs),里面有频率控制,权限控制和认证相关

  3 根据请求方法执行视图类中的相应方法

    视图类中方法的request对象,已经变成了封装后的request

drf的Request类:

  1 原生的request是self._request

  2 data(post提交的数据,urlencoded,formdata编码方式的数据,json格式)

    提交的data的类型并不是固定的,可能是QuerDict post提交的数据类型,也可能是字典

  3 query_params 就是原生request的GET的数据

  4 上传的文件是从FILES中取

  

  5 (重点)其他的属性,直接request.属性名当属性不存在就会执行该该方法(因为Request重写了__getattr__方法)

postman的安装和使用

模拟向接口发送请求,测试接口 它不是浏览器不会有重定向加反斜杠再走一遍

DRF cbv源码分析 restful规范10条 drf:APIView的源码 Request的源码 postman的安装和使用的更多相关文章

  1. cvb源码分析,resful规范,drf,drf序列化组件,95

    1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...

  2. Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析

    Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...

  3. restful规范与rest_framework

    django两种开发模式: 一.前后端不分离项目 二.前后端分离项目 什么是restful规范? 在前后端不分离的项目中,网页所需要的数据可以直接通过模板渲染的方式传递到前端页面,并且可以很好的支持d ...

  4. DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render

    DRF框架    全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...

  5. drf框架,restful接口规范,源码分析

    复习 """ 1.vue如果控制html 在html中设置挂载点.导入vue.js环境.创建Vue对象与挂载点绑定 2.vue是渐进式js框架 3.vue指令 {{ }} ...

  6. drf 简介以及部分源码分析

    目录 复习 drf框架 全称:django-rest framework 知识点 接口 restful接口规范 基于restful规范的原生Django接口 主路由:url.py api组件的子路由: ...

  7. 接口、RESTful规范、DRF

    接口 #接口:url连接,通过向链接发送不同的类型请求与参数得到相应的响应数据 #1.在视图书写处理请求的 视图函数 #2.在路由层为视图函数配置 url链接=>产生接口 #3.前台通过ajax ...

  8. TOMCAT8源码分析——处理请求分析(下)

    前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...

  9. Tomcat源码分析——请求原理分析(下)

    前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...

随机推荐

  1. 两个字说清楚编程语言实质-Python基础前传(3)

    大家都知道Python对于数据分析而言,意义重大.但对于运用Python来做数据分析的我们来说,学习一门编程语言,却有不小的难度:首先大部分伙伴不是计算机相关专业的科班出身,其次我们基本上也都没有程序 ...

  2. C语言基础语法之指向函数的指针

    指针是C语言的精髓,对于初学者来讲,指针是C语言语法学习中比较难的知识点,而这里面指向函数的指针更是不太容易理解. 下面给大家讲下怎样学习理解C语言中指向函数的指针及编程方法和使用例子. 注意:这是一 ...

  3. Contos 安装Tomcat

    # 下载安装包 wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.40/bin/apache-tomcat-8. ...

  4. Java后台开发精选知识图谱

    1.引言: 学习一个新的技术时,其实不在于跟着某个教程敲出了几行.几百行代码,这样你最多只能知其然而不知其所以然,进步缓慢且深度有限,最重要的是一开始就对整个学习路线有宏观.简洁的认识,确定大的学习方 ...

  5. 【APUE】第3章 文件I/O (3) 文件共享、原子操作、函数dup/dup2、函数sync/fsync/fdatasync、函数fcntl、函数ioct1、目录/dev/fd 使用说明

    1.文件共享 UNIX系统支持在不同的进程间共享打开文件.为了说明这种共享,以下介绍内核用于所有I/O的数据结构. 内核使用3种数据结构表示打开文件,它们之间的关系决定了在文件共享方面一个进程对另一个 ...

  6. MySQL优化相关参数--先做个记录,以后可能用得到

    innodb_io_capacity:可设置的磁盘IO性能参数,越高代表当前mysql的IO性能更好,可用做决策刷脏页速度的参数: innodb_flush_neighbors:刷脏页是否开启连坐机制 ...

  7. Netfilter 之 iptable_mangle

    初始化 iptable_mangle_table_init函数通过调用ipt_register_table完成mangle表注册和钩子函数注册的功能:该流程与iptable_filter的函数调用的函 ...

  8. React Native解决安卓图片被挤压

    Bug如下图所示: iOS显示正常,而安卓出现图片被挤压上去. 最后的解决方法: 比如你的 图片 是 750 x 513 那么 你设置样式的时候 width 为 屏幕的宽 ,高度为 屏幕的 宽 / ( ...

  9. 编译安装了的nginx 添加http_ssl_module模块

    1.看下编译安装nginx的时候,都编译安装的哪些模块. [root@zabbix ~]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1. ...

  10. mgo连接池

    package main import ( "log" "sync" "time" "gopkg.in/mgo.v2" ...