Restful api和django

什么是RESTFUL

Representational State Transfer的缩写,翻译是"表现层状态转化"。

如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

RESTFUL规定了apis的类型及其对应的作用,还规定了路由的命名方式。
RESTFUL架构

Django Restful Framework

可以帮我们快速编写基于Restful的python框架
使用方式:
首先根据我们写好的models.py,编写各实体对应的序列化器:

# serializer.py
from rest_framework import serializers

#这是从models.py里面导出来的实体类
from backend.models import UserInfo, Document


class UserInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserInfo  # 序列化的对象名
        fields = '__all__'  # 序列化的字段名,或者指定字段 fields = ("id","name","age")


class DocumentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Document  # 序列化的对象名
        fields = '__all__'  # 序列化的字段名,或者指定字段 fields = ("id",
        # "name","age")

在urls.py之中:

from rest_framework.routers import DefaultRouter
router = DefaultRouter()

之后便可以在views.py之中开发了:

@api_view(['GET', 'POST'])
def document_list(request):
    """
    该方法用于获取Document列表的数据或者是更新某一列Document
    :param request: HTTP请求
    :return: 序列化的Document的集合
    """
    # 用于获取Document列表
    if request.method == 'GET':
        start_index = int(request.GET.get('startIndex'))  # 表示请求的Document列表的起始序号
        end_index = int(request.GET.get('endIndex'))  # 表示请求的Document列表的结束序号
        documents = Document.objects.filter(owner_id=request.COOKIES.get('user_id'))[start_index:end_index]
        document_list_serializer = DocumentSerializer(documents, many=True)  # 将结果集序列化
        response = Response(document_list_serializer.data)
        if not request.COOKIES.__contains__('total'):  # 如果还没设置过表示总数的cookies则设置一次
            total_num = Document.objects.filter(owner_id=request.COOKIES.get('user_id')).count()
            response.set_cookie('total', total_num)
        return response

    # 用于更新Document对象
    elif request.method == 'POST':
        request.data['owner'] = request.COOKIES.get('user_id')
        request.data['status'] = 1
        request.data['lastModifiedDate'] = ''
        document_list_serializer = DocumentSerializer(data=request.data)
        if document_list_serializer.is_valid():
            document_list_serializer.save()
            response = Response(document_list_serializer.data, status=status.HTTP_201_CREATED)
            response.set_cookie('total', int(request.COOKIES.get('total')) + 1)
            return response
        return Response(document_list_serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET', 'PUT', 'DELETE'])
def document_detail(request, pk):
    """
    对Document对象具体细节的更新
    :param request: HTTP请求
    :param pk: 要处理的对象的主键
    :return: HTTP Response
    """
    try:
        document = Document.objects.get(id=pk)  # 获取要操作的对象
    except Document.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        document_serializer = DocumentSerializer(document)
        return Response(document_serializer.data)

    elif request.method == 'PUT':  # 更新Document
        document_serializer = DocumentSerializer(document, data=request.data)
        if document_serializer.is_valid():
            document_serializer.save()
            return Response(document_serializer.data)
        return Response(document_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':  # 删除Document
        document.delete()
        response = Response(status=status.HTTP_204_NO_CONTENT)
        response.set_cookie('total', int(request.COOKIES.get('total')) - 1)
        return response
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值