Django框架实现RESTful API,对商品信息的增删改查,前后端分离

news2025/2/27 10:24:59

如果是第一次接触Django框架,可以先了解Django项目是怎么创建的。

文章目录

  • 1.什么是RESTful API?
    • 1.1RESTful API 中的动作
  • 2.使用Django框架实现RESTful 接口
    • 2.1初始化项目,安装必要的环境
    • 2.2定义商品模型
    • 2.3 迁移数据到数据库
    • 2.4 创建序列化类
    • 2.5在视图创建商品增删改查的函数
    • 2.6绑定url
  • 3.使用Postman 测试接口

1.什么是RESTful API?

RESTful API(Representational State Transfer API)是一种基于REST架构风格的应用程序接口。REST是一种设计风格,它通常用于构建分布式系统和网络应用程序。RESTful API设计的目标是使系统更加简单、可扩展、灵活,并具有良好的性能。
在这里插入图片描述

以下是RESTful API的一些关键特征:

  • 资源(Resources): 在REST中,数据和功能被视为资源,每个资源都有唯一的标识符(通常是URI)。
  • 表现层(Representation): 资源的状态以某种形式传输,可以是JSON、XML等格式。
  • 状态无关(Stateless): 每个请求从客户端包含所有信息,服务器不会存储关于客户端的任何信息。会话状态被完全存储在客户端。
  • 统一接口(Uniform Interface): 统一的方式与资源进行交互,包括资源标识符、资源的表现形式和基于标准方法的有限集合。
  • 无连接(Stateless):每个请求从客户端包含所有信息,服务器不会存储关于客户端的任何信息。会话状态被完全存储在客户端。

RESTful API可以通过HTTP协议进行通信,使用HTTP动词(GET、POST、PUT、DELETE等)来执行操作。这种设计风格的API在构建和维护上更为简单,易于理解和扩展,因此广泛应用于Web服务和移动应用程序的开发中。

1.1RESTful API 中的动作

  • GET(获取):用于从服务器获取资源或其属性的信息。
  • POST(创建): 用于在服务器上创建新的资源。客户端通常将数据包含在请求体中,然后服务器创建新资源。
  • PUT(更新): 用于更新服务器上的资源或创建新资源,如果资源已存在则进行更新,如果不存在则创建。
  • DELETE(删除): 用于从服务器上删除资源。

2.使用Django框架实现RESTful 接口

与常规的Django相比,要实现RESTful ,多了Serializer组件。这个组件的主要的作用是将Python数据类型转换为适合呈现的格式(例如JSON)的过程。

2.1初始化项目,安装必要的环境

使用pycharm创建好项目之后,安装所需要的包:Django Rest Framework
在pycharm中的Terminal输入

pip install djangorestframework

安装成功之后,修改settings.py 将framework 加入到当前已经有的配置中。


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',  # rest_frame_work
    'mall', #创建的app
]

如果是后端数据库使用的是Sql server 需要安装另外一个包

pip install mssql-django

修改settings.py中的DATABASES

DATABASES = {
    'default': {
        'ENGINE': 'mssql',
        'NAME': 'mall',  # 数据库名称
        'HOST': '127.0.0.1',  # 地址
        'PORT': '1433',  # 端口
        'USER': 'sa',  # 用户名
        'PASSWORD': '123456',  # 密码
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'MARS_Connection': True,
        },

    }
}

最后如果要使用ORM框架中的模型,必须创建app

python manage.py startapp mall

这里起名叫做mall,然后将mall 也加入settings.py的INSTALLED_APPS配置中。
最后的文件框架

至此项目初始化成功。最终的项目结构如下:
在这里插入图片描述

2.2定义商品模型

在models.py 加入商品模型

from django.db import models
class Product(models.Model):
    name = models.CharField(max_length=255, verbose_name="商品名称")
    description = models.TextField(blank=True, verbose_name="商品描述")
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品价格")
    stock = models.PositiveIntegerField(verbose_name="库存量")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
    def __str__(self):
        return self.name
    class Meta:
        verbose_name = "商品"
        verbose_name_plural = "商品信息"

2.3 迁移数据到数据库

python manage.py makemigrations mall# 让 Django 知道我们在我们的模型有一些变更
python manage.py migrate mall

2.4 创建序列化类

在app文件中新建serializers.py文件,添加以下内容

from rest_framework import serializers

from mall.models import Product


class ProductSerializers(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

在这个示例中:

  • ProductSerializer 是一个序列化类,它继承自 serializers.ModelSerializer。
  • Meta 类定义了与序列化器相关的元数据。
  • model = Product 表示这个序列化器与 Product 模型关联。
  • fields = ‘all’ 表示序列化器应该包含模型中的所有字段。

2.5在视图创建商品增删改查的函数

from django.shortcuts import render
from django.http.response import JsonResponse
from rest_framework.parsers import JSONParser
from rest_framework import status
from mall.models import Product
from mall.serializers import ProductSerializers
from rest_framework.decorators import api_view
@api_view(['GET', 'POST', 'DELETE'])
def product_list(request):
    if request.method == 'GET':
        # 处理 GET 请求,获取所有产品列表
        products = Product.objects.all()
        product_serializer = ProductSerializers(products, many=True)
        return JsonResponse(product_serializer.data, safe=False)  # 返回产品列表的 JSON 数据

    elif request.method == 'POST':
        # 处理 POST 请求,创建新的产品
        product_data = JSONParser().parse(request)
        serializer = ProductSerializers(data=product_data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=status.HTTP_201_CREATED)
        return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        # 处理 DELETE 请求,删除所有产品
        count = Product.objects.all().delete()
        return JsonResponse({'message': '{} product were deleted successfully!'.format(count[0])},
                            status=status.HTTP_204_NO_CONTENT)

@api_view(['GET', 'PUT', 'DELETE'])
def product_detail(request, pk):
    try:
        # 尝试获取指定主键(pk)对应的产品
        product = Product.objects.get(pk=pk)
    except Product.DoesNotExist:
        return JsonResponse({'message': 'The Product does not exist'}, status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        # 处理 GET 请求,返回特定产品的详细信息
        serializer = ProductSerializers(product)
        return JsonResponse(serializer.data)

    elif request.method == 'PUT':
        # 处理 PUT 请求,更新特定产品的详细信息
        product_data = JSONParser().parse(request)
        serializer = ProductSerializers(product, data=product_data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        # 处理 DELETE 请求,删除特定产品
        product.delete()
        return JsonResponse({'message': 'Product was deleted successfully!'}, status=status.HTTP_204_NO_CONTENT)

2.6绑定url

与SPringBoot 不同,Django需要手动指定访问的url,具体步骤如下:
1.在app 文件中新建urls.py 文件 手动绑定url

from django.urls import re_path as url
from mall import views

urlpatterns = [
    url(r'^api/products$', views.product_list),
    url(r'^api/products/(?P<pk>[0-9]+)$', views.product_detail),
]

当输入xxxx/api/products 的时候,视图函数会判断是什么类型的动作,根据不同的HTTP动作来执行相应的逻辑。
2. 在项目中的urls.py 引入app的urls ,直接在项目urls.py也可以

from django.urls import re_path as url,include
urlpatterns = [
    url(r'^', include('mall.urls')),
]

3.使用Postman 测试接口

1.首先增加一条信息,使用Postman发送post请求,内容格式为Raw ,JSON
在这里插入图片描述
对应的JSON对象

 {
    "name": "Sample Product",
    "description": "This is a sample product description.",
    "price": 19.99,
    "stock": 100
}

发送请求之后,DJango返回201,代表创建成功。
在这里插入图片描述
2.请求地址不变,发送GET请求。
在这里插入图片描述
成功查询到数据。
3.测试id为2的商品数据,修改地址为 http://127.0.0.1:8000/api/products/2 与上述不同的是 多了数字,代表根据ID查询
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1382626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT上位机开发(知识产权ip保护)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大部分看我们文章的网友&#xff0c;本身就是搞技术出身的&#xff0c;很少是做生意&#xff0c;或者是做销售的。但是技术本身&#xff0c;它又是…

12.2内核空间基于SPI总线的OLED驱动

在内核空间编写SPI设备驱动的要点 在SPI总线控制器的设备树节点下增加SPI设备的设备树节点&#xff0c;节点中必须包含 reg 属性、 compatible 属性、 spi-max-frequency 属性&#xff0c; reg 属性用于描述片选索引&#xff0c; compatible属性用于设备和驱动的匹配&#xff…

开发辅助六(实现统一数据返回格式+统一异常处理+统一日志处理)

统一返回格式 一、添加枚举类 public enum ResultCodeEnum{SUCCESS(true,20000,"成功"),UNKNOWN_REASON(false,20001,"未知错误");private final Boolean success;private final Inteer code;private final String message;ResultCodeEnum(Boolean succe…

《ORANGE’S:一个操作系统的实现》读书笔记(三十)文件系统(五)

上一篇文章记录了如何进行文件的创建&#xff0c;那么本篇文章要记录的事情就是如何在创建的文件中进行读写操作&#xff0c;毕竟文件是要操作才有意义的。 读写文件 由于我们使用“一次分配&#xff0c;终身使用”的扇区分配策略&#xff0c;所以文件读写变得非常容易&#…

4_【Linux版】重装数据库问题处理记录

1、卸载已安装的oracle数据库。 2、知识点补充&#xff1a; 3、调整/dev/shm/的大小 【linux下修改/dev/shm tmpfs文件系统大小 - saratearing - 博客园 (cnblogs.com)】 mount -o remount,size100g /dev/shm 4、重装oracle后没有orainstRoot.sh 【重装oracle后没有orains…

外国入境的免签国家以及中外互免(普通护照*、普通公务护照)

2024.1.11起&#xff0c;外籍人员在北京首都、北京大兴、上海浦东、杭州萧山、厦门高崎、广州白云、深圳宝安、成都天府、西安咸阳9个国际机场&#xff0c;推行24小时直接过境旅客免办边检手续。对于持24小时内国际联程机票&#xff0c;经上述任一机场过境前往第三国或地区的出…

Leading Dimension是什么

在LAPACK中频繁出现Leading Dimension&#xff08;中文翻译为“主维度”&#xff09;&#xff0c;那么它是什么呢&#xff1f; 首先了解行主序&#xff08;Row-Major&#xff09;和列主序&#xff08;Column-Major&#xff09;的概念&#xff1a; Given a matrix A of shape …

低代码助力制造业数智转型,激发创新力迎接工业 4.0

随着科技的不断进步&#xff0c;我们迈入了一个崭新的工业时代——工业4.0。这场工业革命不仅颠覆了制造业的传统形象&#xff0c;还为全球生产方式带来了前所未有的变革。 在这一过程中&#xff0c;制造业数字化转型逐渐成为主旋律&#xff0c;而低代码技术在这其中发挥着重要…

Azure Machine Learning - 视频AI技术

Azure AI 视频索引器是构建在 Azure 媒体服务和 Azure AI 服务&#xff08;如人脸检测、翻译器、Azure AI 视觉和语音&#xff09;基础之上的一个云应用程序&#xff0c;是 Azure AI 服务的一部分。 有了 Azure 视频索引器&#xff0c;就可以使用 Azure AI 视频索引器视频和音频…

注册中心--zookeeper 安装并启动

zookeeper 安装/启动 注册中心--zookeeper安装步骤zookeeper常用命令 注册中心–zookeeper zookeeper官方下载地址 最早由雅虎开发&#xff0c;用来解决分布式系统中的一致性问题。功能&#xff1a;包括配置管理、集群的扩容和缩容、分布式锁等等。 安装步骤 1&#xff09;…

使用kibana来创建ElasticSearch的索引库与文档的命令

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;使用kibana来为ElasticSearch创建索引库&#x1f380;使用kibana来为ElasticSearch创建修改文档 &#x1f412;个人主页 &#x1f3c5;JavaEE系列专栏 &#x1f4d6;前言…

Jetpack Flow 、Room 初学者学习记录

学习使用响应式Flow操作数据&#xff0c;记录自己学习的过程。 ContactViewModel 是一个 ViewModel&#xff0c;它依赖于一个Room操作接口 ContactDao &#xff0c;访问对象来获取联系人数据。它使用了 StateFlow 来处理状态的变化和数据的更新。ViewModels 通常用于管理应用的…

【数据结构】树和二叉树堆(基本概念介绍)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​ 目录 前言 树的概念 树的常见名词 树与…

【OpenGauss源码学习 —— 执行器(execMain)】

执行器&#xff08;execMain&#xff09; 概述文件内容作用执行的操作主要函数概述 部分函数详细分析ExecutorStart 函数standard_ExecutorStart 函数 ExecutorRun 函数standard_ExecutorRun 函数 ExecutorFinish 函数standard_ExecutorFinish 函数 ExecutorEnd 函数standard_E…

[软件工具]通用OCR识别文字识别中文识别服务程序可局域网访问

【软件界面】 【算法介绍】 采用业界最先进算法之一paddlocr&#xff0c;PaddleOCR&#xff0c;全称PaddlePaddle OCR&#xff0c;是一种基于深度学习的光学字符识别&#xff08;OCR&#xff09;技术。相较于传统的OCR技术&#xff0c;PaddleOCR具有许多优点。 首先&#xff0…

windows下cmake Could NOT find Eigen3 (missing: Eigen3_DIR)解决办法-配置eigen3

在windows下用cmake构建项目&#xff0c;提示Could NOT find Eigen3 (missing: Eigen3_DIR) windows自行编译配置方法:参考这篇博客&#xff0c;我的windows没安装&#xff0c;使用的是VS2019&#xff0c;没有差别。 Windows安装配置eigen3 重新编译&#xff0c;这时候可能会…

NUS CS1101S:SICP JavaScript 描述:前言、序言和致谢

前言 原文&#xff1a;Foreword 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 我有幸在我还是学生的时候见到了了不起的 Alan Perlis&#xff0c;并和他交谈了几次。他和我共同深爱和尊重两种非常不同的编程语言&#xff1a;Lisp 和 APL。跟随他的脚步是一项艰巨的任…

插件化简单介绍

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、常见的插件化方案…

深入理解 Spark(三)SparkTask 执行与 shuffle 详解

SparkTask 的分发部署与启动流程分析 Spark Action 算子触发 job 提交 Spark 当中 Stage 切分源码详解 Task 的提交与执行 SparkShuffle 机制详解 MapReduceShuffle 全流程深度剖析 MapReduce 全流程执行过程中参与工作的组件以及他们的执行先后顺序&#xff1a;InputFormat …

山西电力市场日前价格预测【2024-01-15】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-15&#xff09;山西电力市场全天平均日前电价为399.10元/MWh。其中&#xff0c;最高日前电价为583.33元/MWh&#xff0c;预计出现在18:15。最低日前电价为275.09元/MWh&#xff0c;预计…