django开发restful风格的api之@api_view

可能大多数情况下,我们只想做前后端分离的后端。这样的话,我们需要提供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,HttpResponseorHttpStreamingResponse对象。需要使用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的。

你可能感兴趣的:(django开发restful风格的api之@api_view)