django-rest-framework的使用

同步更新于个人博客系统:django-rest-framework的使用

同步更新于个人博客系统:django-rest-framework的使用

同步更新于个人博客系统:django-rest-framework的使用

RESTFUL

在学习这个第三方库之前,我们需要了解什么是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-rest-framework的使用_第1张图片

简单来说,django-rest-framework的作用等同于django中的view+form,我们既可以基于model来直接生成接口,也可以自定义serializers(跟form的用法很像)的字段来生成接口。

快速上手

根据需求来学习可能更容易理解一些!

假设需求如下:需要一套博客接口,接口能够实现如下功能:博客列表,博客详情,新建博客,删除博客

知道需求后,就好对症下药了!

1.安装:

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/

django-rest-framework的使用_第2张图片

博客详情接口: /api/post//  blog_id=1的样例如下:

django-rest-framework的使用_第3张图片

配置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/应该就可以得到如下界面了!其内容就由你自己去慢慢体验摸索啦!

django-rest-framework的使用_第4张图片

总结:djangorestframework是我今天刚刚学习的一个django第三方插件,一开始学的时候还是有点难理解感觉,经过这一天的这么折腾之后,加上这篇博客对其的一个总结,感觉似乎还是慢慢地开始理解消化了,总之,亲身体验,这确实是一个非常好用的第三方插件,风格真的和django很像,从学习djago开始,到对django有了一个大概的了解以后,再学习这个插件,它们给我的相同感受就是:考虑的周到!让开发者能够使用更少的代码实现更多的功能!简直就是开发者的福音!但是这也许会让开发者走另一个极端,毕竟人总是喜欢偷懒的,也许心里会默默想:大佬们都把现成的架子都给我搭好了,直接用,真香!干嘛还自己写?是的,这种想法没错,但是我们在使用一些优秀的框架或者插件的时候,更应该去以学习的心态去使用,不仅要知其然那个,更要知其所以然,所以,不能忘本,写代码的本领不能因此就退化了,多看看源码,多照着敲敲还是有好处滴~

加油!每天一小步,未来一大步!

   

你可能感兴趣的:(web,django,restful,django,python)