利用Django框架实现Restful-Api的序列化,即当其他人访问这个URL时返回json格式的数据。
搭建环境
首先当然是在虚拟环境中使用了,这里我们使用Django-REST-Framework
的库,需要用到的包:
pip install django |
创建工程
首先创建一个名为tutorial
的工程,然后在这个工程中创建一个snippets
的APP:
django-admin.py startproject tutorial |
创建完成之后在tutorial/settings.py中修改一下INSTALLED_APPS,添加两个APP:
INSTALLED_APPS = ( |
创建模型类
创建一个Snippet模型类,用于储存代码段,编写snippets/models.py
:
from django.db import models |
除了注释的那里,其他的代码都很常规,和我们平时Django开发时是一样的。然后就为这个模型创建并迁移数据(这里只是为了展示,所以使用的数据库是Django自带的那个sqlite):
python manage.py makemigrations snippets |
创建序列化类
首先解释一下序列化:在这里可以先简单的理解为serializer
,把模型实例转化为json格式然后响应出去,这样便于客户端调用时解析使用。
例如一个PostModel
,里面有两个字段分别为title
和author
,序列化之后就是{'title':'RESTful API','author':'liu'}
这样的json
格式,这样明显就更适合各种客户端的使用人员解析使用。
那么反序列化其实道理差不多,反序列化之后的数据格式更便于后台使用,等下会有例子加深理解。
解释完序列化,那么接下来就该敲代码了,在snippets
下面创建一个serializers.py
,代码如下:
from rest_framework import serializers |
create和update方法定义在调用serializer.save()
时如何创建或修改完整的实例。
关于下面这行代码:
code = serializers.CharField(style={'base_template':'textarea.html'}) |
暂时需要知道的就是它的功能是控制序列化器渲染到HTML页面时的的显示模板,至于为什么要这样做,是因为这对于控制如何显示可浏览的API特别有用,这将在后面的文章中看到。
使用序列化器
首先进入shell模式:
python manage.py shell |
接下来的操作就和学习Django的orm时那样,创建并保存Snippet模型实例:
from snippets.models import Snippet |
这个时候查看数据库就会发现相关的表中已经多了两行数据,就是我们刚才创建的数据: image
也可以继续在shell中查看:
serializer = SnippetSerializer(snippet) |
将数据渲染成json格式:
content = JSONRenderer().render(serializer.data) |
这里已经出现了json格式,也就是说这个json格式的数据就是要展示在某个URL上,大概可以感觉到,等下我们在访问某个URL时,会返回上面这堆数据供你使用,这其实就完成了一个序列化的过程,也可以看出客户端的功能雏形。
序列化是为了返回json格式的数据给客户端查看和使用数据,那么当客户端需要修改、增加或者删除数据时,就要把过程反过来了,也就是反序列化,把客户端提交的json格式的数据反序列化。
下面的代码把json数据流解析成Python自带的数据格式,便于我们后台Django的操作:
from django.utils.six import BytesIO |
检查并保存数据:
serializer = SnippetSerializer(data=data) |
这个时候查看数据库又多了一条数据:
使用 ModelSerializers
在上面的SnippetSerializer类中,我们继承的是serializers.Serializer类,可以看到SnippetSerializer类中有很多代码其实是和models.py中的Snippet模型类似一样的,所以这里我们可以改进一下。就像在Django中提供了Form类和ModelForm类一样,django-rest-framework为我们提供了Serializer类和ModelSerializer类。利用它可以让我们的代码简洁很多,修改serializers.py:
class SnippetSerializer(serializers.ModelSerializer): |
我们可以通过在shell中的打印来检查序列化器实例中的所有字段:
from snippets.serializers import SnippetSerializer |
打印后出现的效果如下(language非常长,只截取了一部分):
在我们新的SnippetSerializer类中,可以发现和之前的对比代码少了很多,这里体现了ModelSerializer 类的快捷:
- 自动确定字段
- create和update方法的简单默认实现
编写Django视图
接下来要做的就是使用我们的新的Serializer
类编写一些API视图。编辑snippets/views.py
:
from django.http import HttpResponse, JsonResponse |
上面的代码都比较好理解,定义了不同http动作时后台不同的操作,在这里也体现了restful API的理念。
需要注意的是记得添加@csrf_exempt修饰器。
设计Django的urls
为了让视图函数被调用,那当然需要设计一下url了,这里的处理和平时Django开发时是一样的。首先创建snippets/urls.py
:
from django.conf.urls import url |
接着就是tutorial/urls.py,代码如下:
from django.conf.urls import url, include |
对API进行测试
完成了上面那些工作后,就可以开始测试了,退出shell模式并启动服务器,根据我们刚才设计的url发送请求,需要先安装httpie
模块:
pip install httpie |
然后在命令行窗口访问,效果如下:
或者也可以直接在浏览输入网址访问。
到这里,也就实现了一个功能,当其他人访问这个URL时返回json格式的数据给他使用。
声明
本篇文章来自ziv
的博客,仅作整理学习分享。
点击这里访问原文