Skip to content

Latest commit

 

History

History
208 lines (149 loc) · 6.76 KB

2.rest响应重构与mixins父类.md

File metadata and controls

208 lines (149 loc) · 6.76 KB

restful使用指南2

Auth: 王海飞

Data:2018-05-04

Email:[email protected]

github:https://github.com/coco369/knowledge

1. 修改响应的结构

1.1 修改settings.py中的返回数据结构的配置信息

图

注意:定义default_renderer_classes参数,指定render的时候使用我们自定义的CustomJsonRender的类方法

1.2 重构JSONRenderer下的render方法

该方法继承了JSONRenderer并且重构了render方法,修改了返回的数据结构

图

图

2. 异常的响应的结构

自定义异常处理,一定需要继承from rest_framework.exceptions import APIException 中的APIException,在编写自己的异常处理的方法

图

3. PATCH请求,传入空置处理

3.1 空置处理

该patch请求中,我们想要修改id为3的学生的姓名,但是姓名我们传递一个空置,查看返回结果如下:

图

3.2 修改

在serializer中定义s_name的序列化,指定错误的信息,为空的话,提示响应的错误信息

图


4. 页面异步提交api接口请求,并且在前端通过js刷新页面

4.1. 创建实例
4.1.1 后端业务逻辑处理

创建url,定义register,创建serializer_class等

图

图

4.2 前端ajax请求get获取数据并刷新

图

4.3 前端ajax请求delete删除数据

图

图

4.4 直接放入ajax更新删除获取信息的代码
<!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>

5. 跨域请求

5.1 什么是跨域

同源:是指相同的协议、域名、端口,三者都相同才属于同源。

同源策略:浏览器处于安全考虑,在全局层面禁止了页面加载或执行与自身来源不同的域的任何脚本,站外其他来源的脚本同页面的交互则被严格限制。

跨域由于浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域

6. rest中的坑

在实际的django项目中,我们经常需要使用到用户表,但是基于django提供的User表的字段有限,开发者一般都不会使用django提供的User模型,而自己创建User模型,并且基于登录注册的功能,也都会自己去实现,而不会使用django提供的登录注册功能。

重点坑:在我们使用自定义的User模型进行用户的登录以及注册的时候,我们使用自定义的中间件进行对用户进行验证,如果验证通过了,就将当前登录的用户User对象绑定在request中,即request.user = user。这个时候坑就出现了,当我们使用restframework去写api接口的时候,会出现权限认证错误,如下提示:

图

经过分析,可以判断是rest需要进行身份验证,所有我们在settings.py中设置rest的api接口不需要进行authentication的验证,具体配置如下:

图