在学习这个第三方库之前,我们需要了解什么是restful!度娘给的解释如下:
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
所以一句话总结就是:restful是一种设计风格,而不是一种新技术。
具体来说,就是把所请求的实体当作资源,通过http自带的方法(get,post,put,delete)来进行对应的增删改查等操作。比如,get请求就是获取资源。get /user/可以获取用户列表;get /user/1可以获取id=1的用户,其他的方法以此类推。
官方简介如下:
简单来说,django-rest-framework的作用等同于django中的view+form,我们既可以基于model来直接生成接口,也可以自定义serializers(跟form的用法很像)的字段来生成接口。
根据需求来学习可能更容易理解一些!
假设需求如下:需要一套博客接口,接口能够实现如下功能:博客列表,博客详情,新建博客,删除博客
知道需求后,就好对症下药了!
pip install djangorestframework
并且将rest_framework添加到installed_app中
//同时需要安装另外一个依赖包:pip install coreapi
2.编写serializer
在blog app下新建serializers文件,并在其中编写如下代码:
# 博客列表的序列化类 class PostSerializer(serializers.ModelSerializer): category = serializers.SlugRelatedField( read_only=True, slug_field='name', ) tag = serializers.SlugRelatedField( many=True, read_only=True, slug_field='name', ) owner = serializers.SlugRelatedField( read_only=True, slug_field='username', ) created_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S') class Meta: model = Post fields = ['id', 'title', 'category', 'tag', 'owner', 'created_time'] # 博客详情的序列化类 class PostDetailSerializer(PostSerializer): class Meta: model = Post fields = ['id', 'title', 'category', 'tag', 'owner', 'content_html', 'created_time'] z
这个写法和modelform的写法是一致的,djangorestframework和django中deform是等同的,它页提供了类似forms.Form和forms.ModelForm的类(serializers.Serializer和serializers.ModelSerializer)。基于同样的逻辑,我们定义的PostSerializer中可以继续实现自定义字段,自定义检查逻辑,自定义数据处理逻辑等方法。
有了serializers之后,新建view层的逻辑,在blog app下新建一个文件apis.py,编写如下代码:
class PostViewSet(viewsets.ModelViewSet): serializer_class = PostSerializer queryset = Post.objects.filter(status=Post.STATUS_NORMAL) def retrieve(self, request, *args, **kwargs): self.serializer_class=PostDetailSerializer return super().retrieve(request,*args,**kwargs)
这样就完成了CRUD(c:create新增,r:retrieve查询,u:update更新,d:delete删除)操作的定义。
上面的逻辑代码编写完成后就可以配置urls了!因为是一套接口,所以django-rest-framework还提供了router的组件来帮我们更好的生成url。在urls.py中增加如下代码:
from rest_framework.routers import DefaultRouter
router=DefaultRouter() router.register(r'post',PostViewSet,basename='api-post')
urlpatterns = [
url(r'^api/',include((router.urls,'api'),namespace='api')),
]
完成以上操作后就有了多个接口。
例:博客列表接口:/api/post/
博客详情接口: /api/post// blog_id=1的样例如下:
配置API DOCS
在需要提供接口给其他团队的情况下,接口文档是整个项目开发流程中必备的产出品之一。编写接口文档是一个相对繁琐且枯燥的工作,并且页需要很细心才行,但大部分情况下需要做的就是把定义好的接口格式抄写到文档中。
同django的第三方插件sumpleui一样,定义好model,完成一些相关配置之后,然后得到界面。那么,是否可以通过简单配置就得到文档呢,甚至得到一套接口的测试工具?
答案是:可以!
那就是djangorestframework提供的docs工具!
配置非常简单,在urls中增加一行代码即可。
配置前先安装另一个依赖库:pip install coreapi
需要新增如下代码:
from rest_framework.documentation import include_docs_urls urlpatterns=[ url(r'^api/docs/', include_docs_urls(title='typeidea apis'))
]
以上配置完成后重启项目,访问/api/docs/ 可能会报如下错误:
解决方法也非常简单,参照博客:使用coreapi时提示AttributeError: 'AutoSchema' object has no attribute 'get_link' 错误的解决办法
即在settings中增加如下代码即可:
REST_FRAMEWORK = { 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema', }
以上配置完成后,重启项目再次访问/api/docs/应该就可以得到如下界面了!其内容就由你自己去慢慢体验摸索啦!
总结:djangorestframework是我今天刚刚学习的一个django第三方插件,一开始学的时候还是有点难理解感觉,经过这一天的这么折腾之后,加上这篇博客对其的一个总结,感觉似乎还是慢慢地开始理解消化了,总之,亲身体验,这确实是一个非常好用的第三方插件,风格真的和django很像,从学习djago开始,到对django有了一个大概的了解以后,再学习这个插件,它们给我的相同感受就是:考虑的周到!让开发者能够使用更少的代码实现更多的功能!简直就是开发者的福音!但是这也许会让开发者走另一个极端,毕竟人总是喜欢偷懒的,也许心里会默默想:大佬们都把现成的架子都给我搭好了,直接用,真香!干嘛还自己写?是的,这种想法没错,但是我们在使用一些优秀的框架或者插件的时候,更应该去以学习的心态去使用,不仅要知其然那个,更要知其所以然,所以,不能忘本,写代码的本领不能因此就退化了,多看看源码,多照着敲敲还是有好处滴~
加油!每天一小步,未来一大步!