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编码格式的数据?他的源码流程是怎么样的?我们明天讲。

posted @ 2018-09-17 19:49  黑猫不是警长  阅读(605)  评论(0编辑  收藏  举报