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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39236849/article/details/113525047

智能推荐

计算机是黄金专业,学这些专业, 毕业第一年年薪超过十万, 真正的“黄金”专业!..._weixin_39917811的博客-程序员宅基地

上大学,就要学习一个有前途的专业。这种观点越来越受到人们的认可。很多学生分数虽然够了比较好的大学,但是擦边进去,学不到好专业,将来工作照样不好找。所以今年高考中,出现很多这种情况,分数够了北大或清华的分数线,但是因为怕选不到自己心怡的专业,放弃我国最强的两所大学,转而投向稍微低一些的高校,学习更有前途的专业,这也是学生和家长越来越务实的表现。那么哪些专业是好专业呢?其中,最重要的一条标准就是薪资高...

YARN 在快手的应用实践与技术演进之路_过往记忆的博客-程序员宅基地

本文是房孝敬老师主题为“yarn在快手应用实践与技术演进之路”的分享整理,内容包含yarn系统在快手的应用实践,遇到的问题以及相应的技术演进过程。讲师介绍:房孝敬,快手大数据架构团队调度方向负责人,目前负责快手公司Hadoop生态中调度、AI架构等子系统内核与周边子系统的研发,并推动在公司内的应用。2011年毕业于北京邮电大学,曾就职于阿里、腾讯。主要研究领域包括Docker云平台,分布式调度和计...

Angular15 利用ng2-file-upload实现文件上传_weixin_30653023的博客-程序员宅基地

待更新转载于:https://www.cnblogs.com/NeverCtrl-C/p/8279246.html

原生js写的贪吃蛇网页版游戏特效_weixin_33909059的博客-程序员宅基地

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><body><title>原生js写的贪吃蛇网页版游戏特效代码 demo by js.alixixi.com</title></body><scri...

Packet for query is too large (4,544,730 > 4,194,304). You can change this value on the server by se..._花儿为何那样红的博客-程序员宅基地

修改 my.ini 加上 max_allowed_packet =6710886467108864=64M默认大小4194304 也就是4M修改完成之后要重启mysql服务,如果通过命令行修改就不用重启mysql服务。命令修改:设置为500Mmysql> set global max_allowed_packet = 500*1024*1024;查看mysql的max_al...

javascript正则表达式_The butcher的博客-程序员宅基地

// 正则:// 正确的规则:// 字符的正则的规则,所以说,正则使用来操作字符串的 // 正则对字符串提供的三大功能: // 验证: reg.test(str) // 查询: str.search(reg) / str.match(reg) // 替换: str.replace(reg,newStr); // 注意:哪个方法...

随便推点

关于SQL的学习记录(八、SQL函数的使用)_木可就(~ ̄▽ ̄)~的博客-程序员宅基地

SQL函数的使用SQL函数的说明:SQL函数是不通用的。SQL函数与前面所讲的SQL语句不同,它们在不同的数据库管理系统中不能通用,因为每一个数据库管理系统都有一套自己的SQL函数,而只有很少的函数在大多数DBMS中都能使用。例如:功能SQL Server函数Oracel函数或语句MySQL函数获取字符串的某部分SUBSTRING()SUBSTR()SUBSTRING()获取当前日期GETDATE()SYSDATECURDATE()转换数据类型CONV

电脑服务器系统消息,Site Component Manager logs error status messages | Microsoft Docs_weixin_39598941的博客-程序员宅基地

Site Component Manager may log error status messages after installing SMS 2003 or Configuration Manager 200712/16/20205 分钟可看完本文内容This article helps you fix an issue in which Site Component Manager may...

分布式事务以及背后的思考CAP理论和BASE理论_crossroads10的博客-程序员宅基地

分布式事务在单机数据库中,我们很容易能够实现一套满足ACID特性的事务处理系统,在在分布式数据库中,数据分散在各台不同的机器上,如何对这些数据进行分布式的事务处理具有非常大的挑。分布式事务是指事务的参与者、支持事务的机器、资源服务器以及事务管理器分别位于分布式系统的不同节点上,通常一个分布式事务中会涉及对多个数据源或业务系统的操作。可以想象一下典型的分布式事务场景:例子:一个跨银行的转账操作设计调用两个异地的银行服务,其中一个是本地银行提供的取款服务,另一个则是目标银行提供的存款服务,这两个

HCNP_vlan笔记_weixin_33713350的博客-程序员宅基地

VLAN听课笔记1. 交换机转发数据帧机制帧类型单播:①已知单播帧(直接转发);②未知单播帧(泛洪);组播:①可以识别的组播帧(转发);②不可识别的组播帧(丢弃);广播:直接做泛洪处理;转发方式转发丢弃泛洪标签格式说明:1.TAG :在源地址后面;2.TPID :说明可与其他厂商的兼容性;3.PRI :二层帧的优先级;4.CFI :数据帧的类型(不懂什么类型)5.VLA...

【Ubuntu命令记忆】dpkg,wget,cat,tar的用法 满足日常命令行管理ubuntu的需要_段莫凡的博客-程序员宅基地

最近又上手了ubuntu系统的配置,在安装包,解决依赖时觉得每次在网上查如何解决问题翻来覆去都是那几个命令和处理方式,就想试着来记忆一下这几个我目前接触到的包的常见用法,方便以后熟悉后更好的使用和研究。之后估计会再有对这个文章进行更新。首先是我们dpkg吧。这个包的名字其实就是Debian package的缩写。Debian,Centors和Ubuntu以及其商业或社区的故事就留着观者自己去详细的了解一下,别人讲的肯定比我好。对于dkpg目前我接触到的多的就是dpkg -i **包** **in

python 股市 无风险套利_Python期货期权无风险套利监控升级版_weixin_39566914的博客-程序员宅基地

代码基于天勤量化平台,先贴出完整代码:#!/usr/bin/env python# -*- coding: utf-8 -*-#import asynciofrom tqsdk import TqApi, TqAuthfrom contextlib import closingfrom time import time# 创建API实例.api = TqApi(auth=TqAuth("天勤账号...