可能大多数情况下,我们只想做前后端分离的后端。这样的话,我们需要提供api接口,返回json或者xml数据给调用者。如果用django,该如何开放restful风格的接口呢?
Step1:安装djangorestframework
pip install djangorestframework
安装restframwork,并注册到INSTALLED_APPS
Step2 使用装饰器api_view
我们创建一个app,然后在view.py中导入:
from rest_framework.decorators import api_view
from django.http.response import JsonResponse
然后写一个简单的api:
@api_view(['GET'])
def test(request):
return JsonResponse(data={'result':"ok"})
然后我们把url加好,在浏览器中就可以访问了。
tips:
- @api_view是一个装饰器,可以指定该接口支持哪些操作GET/POST/PUT/DELETE
- 返回值需要是一个Response
,
HttpResponseor
HttpStreamingResponse对象。需要使用JsonResponse进行实例化一个response对象。JsonResponse继承自HttpResponse。
上面我们实现了一个简单的api。返回也是将一个字典使用JsonResponse进行转换。并不涉及任何数据模型。而我们一般都是要跟数据库打交道的,我们需要接收请求数据,将其反序列化解析;也需要将我们的数据序列化发送。
Step3 serializers
我们使用serializers来进行数据的序列化和反序列化。
我们在相应的app目录下创建一个models.py文件,然后添加一个数据模型
from django.db import models
# Create your models here.
class Tutorials(models.Model):
title = models.CharField(max_length=70,blank=False,default='')
description = models.CharField(max_length=200,blank=False,default='')
published = models.BooleanField(default=False)
然后我们在创建一个序列化文件serializers.py,创建上面创建的Tutorials模型的序列化的类。该类继承自rest_framework.serializers的ModelSerializer类。在里面,我们设置该序列化类对应的model,以及我们需要序列化的字段。
from rest_framework import serializers
from tutorials.models import Tutorials
class TutorialsSerializer(serializers.ModelSerializer):
class Meta:
model = Tutorials
fields = ['id', 'title', 'description', 'published']
#使用__all__表示所有字段
#fields = '__all__'
准备就绪,我们就创建一个post的请求,看如何添加一条数据
from django.http.response import JsonResponse
from rest_framework.parsers import JSONParser
from rest_framework import status
from tutorials.models import Tutorials
from tutorials.serializers import TutorialsSerializer
from rest_framework.decorators import api_view
@api_view(['POST'])
def add_tutorial(request):
tutorials_data = JSONParser().parse(request)
tutorials_serializer = TutorialsSerializer(data=tutorials_data)
if tutorials_serializer.is_valid():
tutorials_serializer.save()
return JsonResponse(tutorials_serializer.data,status = status.HTTP_201_CREATED)
return JsonResponse(tutorials_serializer.errors,status = status.HTTP_400_BAD_REQUEST)
restframwork提供了json解析器JSONParser用来解析request请求,获得post的请求数据,并解析成json格式:
{'title': 'django', 'description': 'develop', 'published': True}
然后我们把得到的json数据使用我们自定义的TutorialsSerializer进行序列化tutorials_serializer,并通过序列化的类进行数据验证,验证通过后,直接调用序列化实例的save即可进行数据保存。序列化实例的data字段保存了根据我们设置的field字段的反序列化的数据,errors字段保存了错误信息。都是json字段(我们设置的,用JsonResponse就可以将他们转换成Response返回了。
使用@api_view是其中的一种方式,还有另外一种方式是基于APIView的。