改变真正的状态码

RESTful接口本质上需要修改http报头中的状态码,而不是仅仅在data字典中传入状态码。

我们之前在Jsonresponse的请求中可以设置状态码参数,这个参数是真实改变http响应报头中的状态码:
views:

data = {
            'status': 201,
            'mag': 'add success',
            'data': book.to_dict()
        }
        return JsonResponse(data=data, status=201)

帮助:以后在过滤时,直接通过JSONRESPONSE来根据状态码过滤

注意:当在jsonresponse中status为204时,返回到前端的内容是无结果。如下:
views:

    elif request.method == 'DELETE':
        book_obj = Book.objects.get(pk=bookid)
        book_obj.delete()

        data = {
            'msg': 'delete success',
            'status': 204,
            'data': {}
        }
        return JsonResponse(data=data, status=204)

当我们使用204时:


可以看到返回的response全部被过滤掉,所以一般企业开发中直接在response使用204还是比较少的,因为对于前端不太友好。

将json数据加载进页面

将书籍加载到页面中
因为restful使用api,所以使用ajax请求来实现该功能。

新建static文件夹,存放页面,并且在settings中注册。

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

导入jquery文件

BookList.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>BookList</title>
    <script type="text/javascript" src="/static/js/jquery.js"></script>
    <script type="text/javascript">
        /**
            $(function(){// 页面加载完成,加载书籍
                $.getJSON("/api/books/",function(data){
                  console.log(data);
                })
        })
        **/

    $(function (){//点击按钮加载书籍
        $('button').click(function(){
            $.getJSON("/api/books/", function(data){
                console.log(data);
            })
        })
    })
    </script>


</head>
<body>
<div id="container">
    <button>ClickToLoad</button>
    <ul>

    </ul>
</div>
</body>
</html>

测试:访问该网页

可以看到已经成功传输json数据到客户端中。

现在要将数据呈现在网页中
BookList.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>BookList</title>
    <script type="text/javascript" src="/static/js/jquery.js"></script>
    <script type="text/javascript">
        /**
            $(function(){// 页面加载完成,加载书籍
                $.getJSON("/api/books/",function(data){
                  console.log(data);
                })
        })
        **/

    $(function (){//点击按钮加载书籍
        $('button').click(function(){
            $.getJSON("/api/books/", function(data){
                console.log(data);
                if(data['status']===200){
                    var $ul = $('ul');

                    var books =data['data'];
                    for(var i=0; i<books.length;i++){
                        var $li = $("<li></li>");
                        $li.html(books[i]['b_name']);
                        $li.appendTo($ul);
                    }
                }
            })
        })
    })
    </script>


</head>
<body>
<div id="container">
    <button>ClickToLoad</button>
    <ul>

    </ul>
</div>
</body>
</html>

测试:

整理views文件结构

views函数中关于处理书籍的一个函数已经有七十多行,后续views文件的代码量会非常巨大,不利于我们维护和查看,所以我们可以将views.py转化成一个包,将每一类的函数单独存放到各自的文件中。

操作:

  • 右击views.py,选择下图中的convert to python package,将其转化成包


  • 转化成包后,新建BookAPI.py将之前关于Book的函数放入。


  • 在包中的__init__.py中导入BookAPI.py的函数名(否则urls.py找不到views下的book函数名)


  • 测试



可以看到转化成包之后仍然可以正常访问。

优势

现在我们要添加功能,利用用户模块,只需要在views包中新建一个新的py文件。

  • 可以让结构变得清晰
  • 让views变成可插拔式

同理models也可以转化成包,将不同类型的models差分开,便于存储。

利用ajax在页面添加书籍

新建BookCreate.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>BookCreate</title>
    <script type="text/javascript" src="/static/js/jquery.js"></script>
    <script type="text/javascript">
        $(function (){
            $("button").click(function (){
                var b_name = $("#b_name").val();
                var b_price = $("#b_price").val();
                $.post('/api/books/', {"b_name":b_name, 'b_price':b_price}, function (data){
                    console.log(data);
                })
            })
        })
    </script>
</head>
<body>
    <div id="container">
        <form action="#">
            <span>BookName:</span><input type="text" id="b_name" placeholder="please input your book name">
            <br>
            <span>BookPrice</span><input type="text" id="b_price" placeholder="please input your book price">
        </form>
        <button>Create</button>
    </div>

</body>
</html>

测试:

现在增加功能:添加完书籍跳转到查询页面

    <script type="text/javascript">
        $(function (){
            $("button").click(function (){
                var b_name = $("#b_name").val();
                var b_price = $("#b_price").val();
                $.post('/api/books/', {"b_name":b_name, 'b_price':b_price}, function (data){
                    console.log(data);
                    if (data['status']===201){
                        window.open('/static/html/BookList.html', target="_self")
                    }
                })
            })
        })
    </script>

测试:添加完书籍之后完成跳转

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏