Auth: 王海飞
Data:2018-05-04
Email:[email protected]
注意:定义default_renderer_classes参数,指定render的时候使用我们自定义的CustomJsonRender的类方法
该方法继承了JSONRenderer并且重构了render方法,修改了返回的数据结构
自定义异常处理,一定需要继承from rest_framework.exceptions import APIException 中的APIException,在编写自己的异常处理的方法
该patch请求中,我们想要修改id为3的学生的姓名,但是姓名我们传递一个空置,查看返回结果如下:
在serializer中定义s_name的序列化,指定错误的信息,为空的话,提示响应的错误信息
创建url,定义register,创建serializer_class等
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>展示所有学生的信息</title>
<script type="text/javascript" src="/static/js/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$('#showStus').click(function(){
$.get('/stu/student/', function(msg){
s = '<table><tr><td>ID</td><td>姓名</td><td>地址</td><td>操作</td></tr>'
for(var i=0; i<msg.length; i++){
s += '<tr><td>' + msg[i].id + '</td>\
<td>' + msg[i].s_name + '</td>\
<td>' + msg[i].s_tel + '</td><td>\
<a href="javascript:;" onclick="stu_update(' + msg[i].id + ')">编辑</a>|\
<a href="javascript:;" onclick="del_stu(' + msg[i].id + ')">删除</a></td></tr>'
}
s += '</table>'
$('#div_stus').html(s)
}, 'json');
});
});
function del_stu(i){
csrf = $('input[name="csrfmiddlewaretoken"]').val()
$.ajax({
url:'/stu/student/' + i,
type:'DELETE',
headers:{'X-CSRFToken': csrf},
dataType:'json',
success: function(msg){
alert('删除成功');
},
error: function(msg){
console.log(msg)
},
});
};
function stu_update(i){
s = 'ID: <input type="hidden" name="id" value="' + i + '">\
姓名:<input type="text" name="s_name" id="s_name"> \
电话:<input type="text" name="s_tel" id="s_tel">\
<input type="button" value="提交" onclick="update(' + i + ')">'
$('#div_add').html(s)
};
function stu_add(){
s = '姓名:<input type="text" name="s_name" id="s_name"> \
电话:<input type="text" name="s_tel" id="s_tel">\
<input type="button" value="提交" onclick="add()">'
$('#div_add').html(s)
};
function update(i){
csrf = $('input[name="csrfmiddlewaretoken"]').val()
s_name = $('#s_name').val()
s_tel = $('#s_tel').val()
$.ajax({
url: '/stu/student/' + i + '/',
type: 'PATCH',
dataType: 'json',
headers:{'X-CSRFToken': csrf},
data:{'s_name':s_name, 's_tel':s_tel},
success: function(msg){
console.log(msg)
},
error: function(msg){
console.log(msg)
},
});
}
function add(){
csrf = $('input[name="csrfmiddlewaretoken"]').val()
s_name = $('#s_name').val()
s_tel = $('#s_tel').val()
$.ajax({
url: '/stu/student/',
type: 'POST',
dataType: 'json',
headers:{'X-CSRFToken': csrf},
data:{'s_name':s_name, 's_tel':s_tel},
success: function(msg){
console.log(msg)
},
error: function(msg){
console.log(msg)
},
});
}
</script>
</head>
<body>
{% csrf_token %}
<input id="showStus" value="获取所有学生的信息" type="button"></input>
<div id="div_stus">
</div>
<div id="div_add"></div>
<a href="javascript:;" onclick="stu_add()">添加</a>
</body>
</html>
同源:是指相同的协议、域名、端口,三者都相同才属于同源。
同源策略:浏览器处于安全考虑,在全局层面禁止了页面加载或执行与自身来源不同的域的任何脚本,站外其他来源的脚本同页面的交互则被严格限制。
跨域由于浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域
在实际的django项目中,我们经常需要使用到用户表,但是基于django提供的User表的字段有限,开发者一般都不会使用django提供的User模型,而自己创建User模型,并且基于登录注册的功能,也都会自己去实现,而不会使用django提供的登录注册功能。
重点坑:在我们使用自定义的User模型进行用户的登录以及注册的时候,我们使用自定义的中间件进行对用户进行验证,如果验证通过了,就将当前登录的用户User对象绑定在request中,即request.user = user。这个时候坑就出现了,当我们使用restframework去写api接口的时候,会出现权限认证错误,如下提示:
经过分析,可以判断是rest需要进行身份验证,所有我们在settings.py中设置rest的api接口不需要进行authentication的验证,具体配置如下: