使用Django REST Framework来快速实现API调用服务——下篇(编写API服务)

使用Django REST Framework来快速实现API调用服务——下篇(编写API服务)

 

增加加载Djagno REST Framework模块的选项

对于settings.py文件的INSTALLED_APPS增加’rest_framework’的加载项。要利用这个框架生成REST API调用服务,需要实现以下三个模块:

  1. Serializer:决定如何序列化(或反序列化)模型实体
  2. ViewSet:决定要序列化哪些模型实体
  3. URL pattern:决定如何解析URL为对应的服务

看来要实现最基本的API服务所需的代码量并不少啊,但是经过这样模块分割之后,程序的框架其实变得清晰了不少,并且有了更强大的可拓展性。

 

实现Serializer

新建一个文件blog/serializer.py,内容如下:

# coding: utf-8
from rest_framework import serializers
from .models import User, Entry

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('name', 'mail')

class EntrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Entry
        fields = ('title', 'body', 'created_at', 'status', 'author')

以上就是定义一个Serializer最简单的代码,model指定对应的模型实体,fields指定要序列化的数据域(可理解为数据库表的某一列)。

 
其中值得一提的是EntrySerializer中的author,它作为一个外键,其默认输出的是对应模型实体(User)的序列化结果。当然,我们可以修改其序列化实现方式。

 

实现ViewSet

新建一个文件blog/views.py,内容如下:

# coding: utf-8
import django_filters
from rest_framework import viewsets, filters
from .models import User, Entry
from .serializer import UserSerializer, EntrySerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class EntryViewSet(viewsets.ModelViewSet):
    queryset = Entry.objects.all()
    serializer_class = EntrySerializer

 

实现URL pattern

修改django_rest_framework_test/urls.py,内容如下:

# coding: utf-8
from django.conf.urls import url, include
from django.contrib import admin
from blog.urls import router as blog_router

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # blog.urlsをincludeする
    url(r'^api/', include(blog_router.urls)),
]

新建一个文件blog/urls.py,内容如下:

# coding: utf-8
from rest_framework import routers
from .views import UserViewSet, EntryViewSet

router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'entries', EntryViewSet)

这样URL pattern的定义就完成了,/api/就是我们REST API服务的入口。

 

验证结果

执行python3 manage.py runserver启动服务器,然后在浏览器的地址栏中输入http://localhost:8000/api/就可以查看我们提供的API服务的整体情况。
API服务的整体情况
如果我们只想获取我们真正想要的数据——序列化之后的JSON字符串,可以在最后加上参数?format=json,或者在命令行输入curl http://localhost:8000/api/

 
如果我们想输出所有的博客文章,可以在命令行执行

$ curl http://localhost:8000/api/entries/
{"count":1,"next":null,"previous":null,"results":[{"id":1,"title":"测试1的标题","body":"测试1的正文","created_at":"2017-06-05T08:20:39.485093Z","status":"draft","author":{"id":1,"name":"TestUser1","mail":"******@qq.com"}}]}

 
如果我们想查找并输出id为1的博客文章,可以在浏览器的地址栏中输入http://localhost:8000/api/entries/1
ID为1的博客文章

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值