zoukankan      html  css  js  c++  java
  • Django RestFramework

    vue的基础知识讲完了,我们要开始学习后端写接口了。

    1.预备知识:CBV(class based view)和FBV(function based view)

    写FBV的时候的url是这样写的,url(r'^login/', views.login),后面不能加(),加上括号后,django在加载的过程中就会执行函数。

    我们工作中用到的更多是CBV,所以我们一般写接口的时候都写成CBV的。当我们发送get或者post请求时,django是怎么识别是get请求还是post请求的?

    2.我们来解读一下CBV的源码,看看CBV的流程是怎么样的。

    先来简单写一个CBV,

    先配好路由,然后写视图函数,

    路由之所以写成  url(r'^login/', views.LoginView.as_view()),  是因为执行了LoginView类中的as_view的方法。如果LoginView类中没有,就从父类中寻找,我们点进去View,找到as_view方法,中间的源码部分看不懂的直接跳过,直接看返回的是什么?他返回的是view。又找到view方法,返回的是self.dispatch方法。

    然后再self.dispatch中中执行了相应的请求函数。

    这就是源码的流程。。。

     3 restful协议

    restful与技术无关,代表的是一种软件架构风格,是represontational state transfer的简称。

    所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性

    面向资源架构(ROA:Resource Oriented Architecture)

    我们之前写的增删改查的url:

        127.0.0.1:8000/books
                   127.0.0.1:8000/books/add/
                   127.0.0.1:8000/books/change/1
                   127.0.0.1:8000/books/delete/1                               不符合规范,因为在url中是不应该有动词的。

    http协议请求方式:GET POST,DELETE,PUT,PATCH,OPTION.HEAD   

    restful使用不同的请求方式去做url的分支
                            GET              
                    books-------->查看数据--------------------> 返回所有数据列表 :[{},{},{}]
                            POST
                    books-------->添加数据--------------------->返回添加数据 :{}
                            PUT
                    books/1------->更新pk=1的数据--------------->返回更新后的数据: {}
                            Delete
                    books/1-------> 删除pk=1的数据-------------->返回空
                            GET
                    books/1------->查看单条数据   --------------->返回查看的单条数据 {}

    4。 Django RestFramework (DRF)

    Django RestFramework是基于restful协议的一种框架。可以把它看成一个app。

     先下载Django RestFramework,pip  install djangorestframework (或者执行python -m pip install djangorestframework)

      (1) APIView  (*****)
      (2) 序列化组件(*****)
      (3) 视图类(mixin)(*****)
      (4) 认证组件
      (5) 权限组件
      (6) 频率组件
      (7) 分页组件
      (8) 解析器组件(*****)
      (9) 响应器组件
      (10) url控制器

    介绍restframework之前,我们先不用restframework写一个接口。

    基于CBV的接口设计:

    基于DRF的接口设计:使用DRF框架做接口会更简单,因为DRF框架中还会有一些其他的作用,比如说认证,权限,频率的功能,DRF框架都帮我们做了。在这个例子中体现不出来,因为这个例子中接口单一,结构简单。

    ###############基于DRF的接口设计###################
    from rest_framework.views import APIView
    class CourseView(APIView):
        def get(self,request):
            course_list = Course.objects.all()
            ret = []
            for course in course_list:
                ret.append({
                    "title":course.title,
                    "desc":course.desc,
                })
            return HttpResponse(json.dumps(ret,ensure_ascii=False))

    再来看一下这个APIView的源码是怎么执行的?

    同样当用户访问   url(r'^course/', views.CourseView.as_view()),   执行了CourseView类中的as.view方法,如果没有,就从父类APIView中找as.View方法,

    APIView中的dispatch方法和刚才说的CBV中的dispatch方法不一样:

    这就是APIView的源码流程。

     5.数据编码格式

    我们在提交post请求时,默认发送的是urlencode的数据编码格式 

    是不能发送json数据编码格式给后端的。

    但是我们可以利用ajax发送json数据。

     如何发送json数据到服务器?

    用form表单发送请求时默认发送的是urlencod的编码格式:csrfmiddlewaretoken=9zhMjaMwYn2gPndPUueZdzzrALk04cbeoRvSefQKqUJW1rQnMP2wuRh1I0WN58Bd&user=yangbo&pwd=123。

     这种编码格式发送过去之后django默认会解析这种编码格式。

    那么我们再来用ajax发送请求:

    $('.btn').click(function () {
            $.ajax({
                url:"",
                type:'post',
                data:{
                    user:'alex',
                    pwd:'123',
                },
                success:function (data) {
                    console.log(data)
                }
            })
        })

    我们要明白一件事情,就是这样发送的数据依然默认是urlencode编码格式。

          JS                                       Python
                    相当于
    JSON.Stringfy(data)   ============  json.dumps(data)
    JSON.parser(data)     ============  json.loads(data)

     $('.btn').click(function () {
            $.ajax({
                url:"",
                type:'post',
                contentType:"json",
                data:JSON.stringify({user:'alex',
                    pwd:'123',
                }),
                success:function (data) {
                    console.log(data)
                }
            })
        })

    这样发过去就是json数据的编码格式了。

    数据虽然发送过去了,而且django也接受到了, 但是django只是默认解析urlencode编码格式,但是对于json的编码格式,django不会解析。所以他接受到的是空。

    Django默认解析器:
        if contentType:application/x-www-form-urlencoded:
             user=yuan&pwd=123&a=1  -----》request.POST={"user":"yuan","pwd"}
        else:
            request.POST={}

     那么在后台怎么知道数据发送过来呢?

    通过request.body来拿。request.body里面放的是请求体里面的原生数据。

    拿到json格式的字节串了,那么我们怎么拿到数据呢?

     但是当我们的courseview视图类函数继承了APIView,在APIView中重新封装了request(源码解析见上面),所以不管是urlencode还是json数据的编码格式通过request.data都能够解析出来:

    这里可以利用postman软件测试一下,postman软件可以模拟html发送post请求,不用在写html页面了。

    那request.data是怎么实现既能解析urlencode编码格式的数据,又能解析json编码格式的数据?他的源码流程是怎么样的?我们明天讲。

  • 相关阅读:
    第三周psp
    作业2
    词频统计 SPEC 20170914 1 1 1 1 1
    psp1111
    第一周大作业1
    mongodb安装操作 (2018/11/12)
    中间件 express生成项目(2018/11/10)
    express环境搭建(2018/11/09)
    后端路由(2018/11/07)
    Node模块的基本使用(2018/11/06)
  • 原文地址:https://www.cnblogs.com/yb635238477/p/9664443.html
Copyright © 2011-2022 走看看