博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cbv、resful、APIView和序列化组件
阅读量:5846 次
发布时间:2019-06-18

本文共 4425 字,大约阅读时间需要 14 分钟。

CBV的源码分析

  -Class Base View(基于类的视图)

  -Function Base View( 基于函数的视图)

  -def as_view 类方法

  -def view:类方法内部,闭包函数定义:内层函数包含对外部作用域的引用

  -python中一切皆对象:函数也是对象

  -hasattr(self, 'get')--判断self类中是不是有该(get)方法

  -反射 setattr(self,get,get_all):相当于把get函数,变成了get_all

   -getattr(self, 'get'):拿到get函数的内存地址

 

- def view(request, *args, **kwargs):        self = cls(**initkwargs)        if hasattr(self, 'get') and not hasattr(self, 'head'):            self.head = self.get        self.request = request        self.args = args        self.kwargs = kwargs        #执行:dispatch:谁的dispatch方法?写的cbv的那个c,视图中的那个视图类        #我这个类如果没有写dispatch,会执行View中的dispatch方法        return self.dispatch(request, *args, **kwargs)

 

-def dispatch(self, request, *args, **kwargs):        #request.method 前台请求的方法,转成了小写        #http_method_names View中定义的一个列表:是一堆请求方式        if request.method.lower() in self.http_method_names:            #getattr的第三个参数是默认值:self.http_method_not_allowed            #拿到get方法的内存地址            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)        else:            handler = self.http_method_not_allowed        #get(request,*args, **kwargs)        return handler(request, *args, **kwargs)            总结:*******请求来了--->as_view---->view---->dispatch--->分发到不同的函数,执行函数,拿到结果,然后返回

 

1、1 阅读源码:

  左侧工具栏----》设置图标---->点击-----》show menbers(能看到py文件,类的方法)

 

2 resful规范(是什么)    -什么是resful(定义)        -是一个规范        -面向资源编程:把网络中所有东西,想象成资源    -规范:        -10条规范        -API与用户的通信协议,总是使用HTTPs协议:https比http安全        -域名             https://api.example.com  尽量将API部署在专用域名(会存在跨域问题)            https://example.org/api/  API很简单            例如写一个查询所有图书的api接口:https://api.example.com/books                                            https://127.0.0.1/api/books        -版本:每个接口都应该有版本            URL,如:https://api.example.com/v1/    https://127.0.0.1/api/v2/books(推荐用这种)            请求头 跨域时,引发发送多次请求        -路径,视网络上任何东西都是资源,均使用名词表示(可复数)            https://api.example.com/v1/books            https://api.example.com/v1/animals            https://api.example.com/v1/employees            不能这么写:                -获取所有图书:https://127.0.0.1/api/get_all_books                -新增一本书:https://127.0.0.1/api/add_book            同一都用这个:            https://api.example.com/v1/books        -method            GET      :从服务器取出资源(一项或多项)            POST    :在服务器新建一个资源            PUT      :在服务器更新资源(客户端提供改变后的完整资源)            PATCH  :在服务器更新资源(客户端提供改变的属性)            DELETE :从服务器删除资源        -过滤,通过在url上传参的形式传递搜索条件            https://api.example.com/v1/zoos?limit=10:指定返回记录的数量        -状态码            请求回去,需要有状态码            自定义状态码            status: 100表示成功                    101表示用户名密码错误                    102我也不知道什么错误        -错误处理,应返回错误信息,error当做key。            -{status:100,error:'错误信息写上'}        -返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。            GET /books:返回资源对象的列表(数组)            GET /books/1:返回单个资源对象            POST /books:返回新生成的资源对象    -新增,传数据,一旦新增完成,把新的资源对象返回            PUT /books/1:返回完整的资源对象            PATCH /books/1:返回完整的资源对象            DELETE /books/1:返回一个空文档        -Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API              方法,使得用户不查文档,也知道下一步应该做什么。                {                    status:100                    msg:成功                    url:127.0.0.1/books/1                }            核心:返回结果中提供链接

 

2.1 django写resful规范的接口2.2 postman软件:模拟发请求的软件2.3 格式化json格式数据    -https://www.json.cn/2.4 put请求,django不会帮我解析body内的数据,需要自己处理            3 drf(django rest framework)框架(django的app)    安装:djangorestframework    -它是一个app,要在咱的项目中用    -只是快速的构建resful规范的接口    -csrf_exempt:局部禁用csrf(csrf是可以局部使用,局部禁用)    -以后再执行的dispatch方法是APIView的dispatch方法    -getattr和setattr    -重点掌握这三点:        -request.data 是个方法,包装成了属性,前台传过来body体中数据的数据,放在里面        -request.query_params  这个是原来GET中的数据        -request把原来的request包装进去了4 APIView源码分析    5 序列化    -1 自己写for循环来处理(麻烦)    -2 django提供的序列化组件(不可控)        from django.core import serializers        ret=serializers.serialize('json','queryset对象')        ret就是序列化之后的字符串了,不需要再序列化了    -3 drf给咱提供的序列化组件        -1 先导入            from rest_framework.serializers import Serializer            from rest_framework import serializers        -2 写一个类,继承Serializer        -3 在类内部写属性:            name=serializers.CharField()        -4 使用:            -先生成对象,需要传参数 instance:要序列化的对象(可能是queryset,也可能是单个对象)                many:如果是queryset---True,,如果是单个对象--False        -5 对象.data --->是一个字典

 

转载于:https://www.cnblogs.com/zhouhao123/p/10098093.html

你可能感兴趣的文章
除了模拟手术教学,VR在医疗领域如何应用?
查看>>
JVM性能调优之如何书写高效优雅的代码
查看>>
谈数据中心“容灾和备份的区别”
查看>>
linux的LVM
查看>>
不同的类UNIX操作系统密码破解方法介绍
查看>>
MySQL 5.6 for Windows配置安装之解压缩版
查看>>
ubuntu jdk
查看>>
hive报错(2)udf无法找到第三方的类
查看>>
HashCode
查看>>
Nginx解析PHP问题
查看>>
A2SD 命令集
查看>>
实例:Linux EXT3文件系统下成功恢复误删的文件[原创]
查看>>
盘点5款Ubuntu监控工具解决CPU暴增问题
查看>>
linux_定时任务
查看>>
Xorg <= 1.10 remote root 0day exploit (32-bit x86)
查看>>
2010下半年网络规划设计师上午试卷、标准参考答案及分析(1)
查看>>
szshunjia储存不干胶标签的心得简述分享
查看>>
最近几年做软件项目的心得总结
查看>>
10个网页设计师必备的CSS技巧(转)
查看>>
我的友情链接
查看>>