在上一篇文章中,主要讲的是请求和响应,项目里面views.py
中的视图函数都是基于函数的,并且我们介绍了@api_view
这个很有用的装饰器。同时,我们还介绍了APIView
这个类,但是还没使用它。在这篇文章中,我们要做的是把基于方法的视图改为基于类的视图,将会了解到APIView
。
改为基于类的视图
重构一下snippets/view.py
:
from snippets.models import Snippet |
到这里应该很容易理解,和原来的相比,可以发现基于类的视图把各种不同的HTTP
请求分离开变成单个的方法,而不是if...elif...
这样的结构,所以这样处理起来很更加的高效。
同样的,把另一个视图函数也进行修改:
class SnippetDetail(APIView): |
修改路由
改为基于类的视图之后,当然也要修改一下路由了,对snippets/urls.py
稍加修改:
from django.conf.urls import url |
使用mixins类
使用基于类的视图的好处除了上面所说的把各种HTTP请求分离开,还有什么好处吗?答案是肯定的——使用基于类的视图的最大优势之一是它可以轻松地构成可重复使用的行为。
可重复使用的行为?简单说,就是让我们少写一点功能类似的代码,由此就要介绍一下mixins
类了,它帮我们封装了很多操作,简化代码,使用也很简单,编辑snippets/view.py
函数:
from snippets.models import Snippet |
新的视图类中继承了 generic.GenericAPIView
、mixins.ListModelMixin
和mixins.CreatteModelMixin
,类的作用看字面意思就能懂啦,mixins
类为我们提供了list()
和create()
方法,当然,使用这两个函数需要先设置queryset
和serializer_class
,这点我们查看一下mixins
的源码就可以看出来了,比如list方法:
class ListModelMixin(object): |
这里的代码会分别通过get_queryset()
和get_serializer()
得到查询集和序列化器,其他封装好的方法也是如此。
知道了这个,再修改一下另一个视图类就很容易了:
class SnippetDetail(mixins.RetrieveModelMixin, |
使用generics视图类
到这里,视图代码已经简化了许多了,但是我要告诉你的是,还可以进一步简化。进一步简化就是连mixins类都不用了,只使用generics就可以了,代码如下
from snippets.models import Snippet |
好了,现在的代码就显得非常简洁了,但是短小却精悍,依然可以实现原本的功能。
测试Api
测试方法和上篇雷同,可跳过。http http://127.0.0.1:8000/snippets/
- 通过设置Accept头部信息来控制返回的格式
http http://127.0.0.1:8000/snippets/ Accept:application/json # JSON |
效果如下(返回的是页面的HTML代码,只展示了一部分):
- 直接加格式后缀
http http://127.0.0.1:8000/snippets.json # JSON suffix |
- 浏览器查看Api
我们可以直接在浏览器输入 http://127.0.0.1:8000/snippets.api
进行查看,会得到一个美观的页面:
增加数据
我们可以控制 Content-Type 头部信息来提交POST请求:
http --form POST http://127.0.0.1:8000/snippets/ code="print 123" |
它会自动在原有的数据后面添加你提交过去的数据,效果如下:
修改数据
我们通过PUT
来实现修改功能,在我们之前定义的函数views.snippet_detail
中:
url(r'^snippets/(?P<pk>[0-9]+)$', views.snippet_detail), |
所以通过 url snippets/[id]
就可以访问到我们要的数据,就可以对其进行修改。
http --json PUT http://127.0.0.1:8000/snippets/1.json code="sss" |
删除数据
同之前的修改一样,我们使用DELETE
,通过 url snippets/[id]
访问数据,提交删除。
http DELETE http://127.0.0.1:8000/snippets/8.json |
这样我们就成功的删除了一条数据。
声明
本篇文章来自ziv
的博客,仅作整理学习分享。
点击这里访问原文。