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 ...
随机推荐
- (Tomcat)服务器之web应用的虚拟目录映射和主机搭建
首先来了解一下web的虚拟目录映射和主机搭建的知识 第一:web的虚拟目录映射 首先我们要知道什么叫做web的虚拟目录映射,这个很好理解的,就是将我们本地硬盘上的web应用映射出一个供外界用户访问的地 ...
- web安全认证机制知多少
如今web服务随处可见,成千上万的web程序被部署到公网上供用户访问,有些系统只针对指定用户开放,属于安全级别较高的web应用,他们需要有一种认证机制以保护系统资源的安全,本文将探讨五种常用的认证机制 ...
- iOS中 DataBase SQL数据库 UI_高级
SQL(Structured query Lauguage) :结构化 查询 语言 1.创建表格的SQL语句 create table if not exists Teacher(tea_id int ...
- iOS APP设计规范大全
目前最为齐全的iOS APP设计规范大全,Mark一个- 欢迎参考本文,未经许可,严禁转载!
- 海量数据挖掘MMDS week1: MapReduce
http://blog.csdn.net/pipisorry/article/details/48443533 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- Linux 开发环境搭建
本文多参考自网上资料,在此多谢这些资料的作者的辛勤劳动! 另外,本文所用 Linux 版本为 CentOS 7.1. 终端配置 安装及配置 Zsh 在默认情况下,Linux 下的终端是 bash,但其 ...
- 【算法导论】最小生成树之Kruskal法
在图论中,树是指无回路存在的连通图.一个连通图的生成树是指包含了所有顶点的树.如果把生成树的边的权值总和作为生成树的权,那么权值最小的生成树就称为最小生成树.因为最小生成树在实际中有很多应用,所以我们 ...
- 《java入门第一季》StringBuffer类小案例
/* * 把数组拼接成一个字符串 */ public class StringBufferTest2 { public static void main(String[] args) { // 定义一 ...
- Linux下使用GDAL进行开发(automake使用)
首先写三个源代码文件,分别是GDALTest.cpp.Fun.cpp和Fun.h,将这三个存放在一个叫GDALTest的文件夹中,然后打开终端,切换到该目录,如下图所示(注:这个图是最后截图的,所以文 ...
- 使用Android Support Design 控件TabLayout 方便快捷实现选项卡功能
1.概述 TabLayout是在2015年的google大会上,google发布了新的Android Support Design库的新组件之一,以此来全面支持Material Design 设计风格 ...