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

发布时间:2024年01月14日

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

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查询
在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_46999174/article/details/135580434
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。