如果是第一次接触Django框架,可以先了解Django项目是怎么创建的。
RESTful API(Representational State Transfer API)是一种基于REST架构风格的应用程序接口。REST是一种设计风格,它通常用于构建分布式系统和网络应用程序。RESTful API设计的目标是使系统更加简单、可扩展、灵活,并具有良好的性能。
以下是RESTful API的一些关键特征:
RESTful API可以通过HTTP协议进行通信,使用HTTP动词(GET、POST、PUT、DELETE等)来执行操作。这种设计风格的API在构建和维护上更为简单,易于理解和扩展,因此广泛应用于Web服务和移动应用程序的开发中。
与常规的Django相比,要实现RESTful ,多了Serializer组件。这个组件的主要的作用是将Python数据类型转换为适合呈现的格式(例如JSON)的过程。
使用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配置中。
最后的文件框架
至此项目初始化成功。最终的项目结构如下:
在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 = "商品信息"
python manage.py makemigrations mall# 让 Django 知道我们在我们的模型有一些变更
python manage.py migrate mall
在app文件中新建serializers.py文件,添加以下内容
from rest_framework import serializers
from mall.models import Product
class ProductSerializers(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
在这个示例中:
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)
与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')),
]
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查询