DjangoRestFramework实践笔记
1、Restful服务的实现方式一共三种:function based view,class based view,viewset+router,这三种实现方式的封装重度依序升高,越往后越适合典型CURD服务,因为我们的产品是互联网产品,服务接口大多数是业务操作,所以主要以function based view为主,偶尔使用class based view。
2、序列化器Serializer的使用,序列化器在输入处理中类似Form,实际是反序列化的作用。同时对输出数据的格式有所定制,真正的序列化定制。当然序列化要想完整使用,就要用modal序列化器,而这个序列化器要直接使用需要是RDB存储,这在如今这个NoSQL盛行的时代,有所约束,不过也算好了。
3、基本配置
- REST_FRAMEWORK = {
- 'DEFAULT_PARSER_CLASSES': (
- 'rest_framework.parsers.JSONParser',#主要使用JSon解析器
- ),
- 'DEFAULT_AUTHENTICATION_CLASSES': (
- 'rest_framework.authentication.TokenAuthentication',#for Restful服务验证
- 'rest_framework.authentication.SessionAuthentication',#for 自动生成文档页面的验证
- ),
- 'DEFAULT_PERMISSION_CLASSES': (
- 'rest_framework.permissions.IsAuthenticated',#所有view的默认认证
- )
- }
4、form文件上传问题,默认使用的JSon解析器可能会对multipart的data body有干扰,导致request.Files解析直接失败,给客户端返回415答复,这个时候需要手动给相关view修改解析器,比如如下函数装饰器配置:
- @parser_classes((MultiPartParser,))
5、引用到user的序列化器对user外键字段的输出要格外小心,这个地方有可能连user的密码字段都输出掉,所以引用user的外键,一定要从序列化器的depth设置或者序列化器关系字段定义等方式上,让user的输出符合你的要求。
6、Field的定制,Field的定制化改写方式是改写to_representation或to_internal_value,前者负责把变量转化成字符串,后者负责把字符串转化成变量,我们这个项目中的FileField为了输出完整路径,改写了to_representation方法:
- class TFileField(serializers.FileField):
- def to_representation(self, obj):
- if not obj:
- return None
- if obj.name.find("/static/") == 0:
- return MEDIA_DOMAIN + obj.name
- else:
- return MEDIA_DOMAIN + "/static/" + obj.url
7、Serializer的定制化改写,我说一个我的改写场景,某对象的聚合对象的属性需要和主对象属性并列,这个采用官方Serializer的特性只能做到一个外键ID属性并列,其他属性都不可以,于是可以改写Serializer的to_representation如下:
- def to_representation(self, instance):
- ret = super(ContactSerializer,self).to_representation(instance)
- ret["username"] = instance.user.username
- return ret
8、调用序列化对象的save时报错:
- ValueError: "<Topic: Topic object>" needs to have a value for field "topic" before this many-to-many relationship can be used.
这个错误在form的save操作时也会出,错误原因,一个新对象在未存储前,不能对他的ManyToMany的关系做操作,原因也很简单,ManyToMany需要新对象的ID,方法就是在序列化器的存储前,先对对象本身save一下,这样新对象有了ID,操作就Ok了。
8、应用加载不完全错误:错误提示:
- AttributeError: type object 'Token' has no attribute 'objects'
错误原因,Token所在的应用'rest_framework.authtoken'没有加在INSTALLED_APPS配置里面,加上即可解决问题。
DjangoRestFramework实践笔记的更多相关文章
- hadoop2.5.2学习及实践笔记(二)—— 编译源代码及导入源码至eclipse
生产环境中hadoop一般会选择64位版本,官方下载的hadoop安装包中的native库是32位的,因此运行64位版本时,需要自己编译64位的native库,并替换掉自带native库. 源码包下的 ...
- Python编程从入门到实践笔记——异常和存储数据
Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...
- Python编程从入门到实践笔记——文件
Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...
- Python编程从入门到实践笔记——类
Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...
- Python编程从入门到实践笔记——函数
Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...
- Python编程从入门到实践笔记——用户输入和while循环
Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...
- Python编程从入门到实践笔记——字典
Python编程从入门到实践笔记——字典 #coding=utf-8 #字典--放在{}中的键值对:跟json很像 #键和值之间用:分隔:键值对之间用,分隔 alien_0 = {'color':'g ...
- Python编程从入门到实践笔记——if语句
Python编程从入门到实践笔记——if语句 #coding=utf-8 cars=['bwm','audi','toyota','subaru','maserati'] bicycles = [&q ...
- Python编程从入门到实践笔记——操作列表
Python编程从入门到实践笔记——操作列表 #coding=utf-8 magicians = ['alice','david','carolina'] #遍历整个列表 for magician i ...
随机推荐
- UNIX环境高级编程——Linux系统调用列表
以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...
- 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题
boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...
- Ubuntu 安装 Mysql 5.6 数据库
Ubuntu 安装 Mysql 5.6 数据库 1)下载: mysql-5.6.13-debian6.0-x86_64.deb http://dev.mysql.com/downloads/mirro ...
- javascript之DOM文档对象模型编程的引入
/* DOM(Document Object Model) 文档对象模型 一个html页面被浏览器加载的时候,浏览器就会对整个html页面上的所有标签都会创建一个对应的 对象进行描述,我们在浏览器上看 ...
- C语言中,#include <>和#include ""的区别和注意点
C语言中包含文件有两种包含符号,一个是<>尖括号,另一个是""双引号.那么这两个有什么区别呢? 首先在本地建立一个空文件,命名为stdio.h. 然后再建立一个C文件, ...
- Visual Studio 2010多线程编程
随着处理数据量的逐渐增大,串行单核的程序,犹如残灯缺月,无法满足运用需求.大规模集群的出现,解决了这一技术难题.本文旨在探讨如何使用多CPU并行编程,关于CUDA的并行前面文章已有讲述.本文结构分为三 ...
- css3学习之旅-css的基本语法(1)
后面就将要介绍css的全面语法: 1.css介绍 2.css基本语法 3.css高级语法 4.css派生选择器 5.css的id选择器 6.css类选择器 7.css属性选择器 !!!!!css介绍 ...
- 《高效能程序员的修炼》读后感 By Yong Zhang
想不到我工作中经常GOOGLE搜寻技术问题的stack overflow网站的创办人竟然是<高效能程序员的修炼>一书的作者!看了一遍全书,果然名不虚传. 本书更多的从人文角度而非技术角度去 ...
- C#之面向对象
话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是晏众文武,在酒席间,曹操诗兴大发,不觉吟道:"喝酒唱歌,人生真爽" ...
- 用U盘安装Ubuntu15.04
用UltraISO刻录Ubuntu15.04到U盘安装,出现:Failed to load idlinux.c32错误,解决办法如下: source url: http://www.ubuntukyl ...