使用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服务的整体情况。

如果我们只想获取我们真正想要的数据——序列化之后的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。

更多相关文章

  1. windows下安装python的三方模块pyExcelerator的问题
  2. Python安装模块(numpy等)问题的两种解决办法——常规方法和Anacond
  3. Python中psutil模块的安装
  4. Python常用模块-摘要算法(hashlib)
  5. Python学习系列(六)(模块)
  6. python,os模块的常用方法
  7. python3中time模块的用法及说明
  8. Python学习笔记(基础篇)_014_GUI模块 easygui的使用
  9. 如何使用pip安装Python MySQLdb模块?

随机推荐

  1. Mysql完全手册(笔记二,使用数据与性能优化)
  2. 如何构建将被输入下拉框的数据?
  3. 使用navicat for mysql 将查询语句过滤的
  4. 如何生成字符串'a'..'zzz'然后将它们保存
  5. 我不能使用PHP和SQL在循环之间传递变量?
  6. 不正确的字符串值:'\xF0\x9F\ xB6\xF
  7. SQL Server调优系列进阶篇(查询语句运行几
  8. SQL基本操作 - 新增、查看、更新、删除表
  9. PostgreSQL数据库学习手册之libpq - C 库
  10. 外部主机不允许连接Mysql设置的解决方法