Django是一套完善而强大的web开发框架, 结合Django Restframework我们可以非常快的搭建一套后台的api, 该api主要特点:
而我们只需要设计好我们的Models(数据模型)
使用Python3+Django2.1+Django Restframework
pip3 install django
pip3 install djangorestframework
创建一个名为django_shop的项目,进入项目目录,创建一个名为shop的应用
django-admin startproject django_shop
cd django_shop
python3 -m manage.py startapp shop
修改项目目录下django_shop/settings.py文件
INSTALLED_APP列表中增加两行, 注册应用及rest_framework框架
INSTALLED_APPS = [
...
'shop.apps.ShopConfig',
'rest_framework'
]
文件末尾增加如下REST_FRAMWORK配置, 以使Api权限生效
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
]
}
Models设计实际上就是数据库表设计, 一个Model对应一张数据库表, 数据模型(数据库表)的设计是一个项目的核心, 我们需要考虑:
我们这里设计4个模型(表):
修改项目目录下的models.py, 创建我们需要的模型
from django.db import models
class Category(models.Model):
name = models.CharField("分类名称", max_length=200, db_index=True)
slug = models.SlugField("分类链接", max_length=200, db_index=True, unique=True)
class Product(models.Model):
category = models.ForeignKey(Category, related_name='category', on_delete=models.CASCADE, verbose_name="所属分类")
name = models.CharField("商品名称", max_length=200, db_index=True)
slug = models.SlugField("商品链接", max_length=200, db_index=True)
description = models.TextField("商品描述", blank=True)
price = models.DecimalField("商品价格", max_digits=10, decimal_places=2)
available = models.BooleanField("是否上架", default=True)
created = models.DateTimeField("创建时间", auto_now_add=True)
updated = models.DateTimeField("更新时间", auto_now=True)
class Order(models.Model):
username = models.CharField("客户姓名", max_length=50)
mobile = models.CharField("客户电话", max_length=25)
address = models.CharField("客户地址", max_length=250)
city = models.CharField("客户城市", max_length=100)
pay_status = models.BooleanField("是否支付", default=False)
created = models.DateTimeField("创建时间", auto_now_add=True)
updated = models.DateTimeField("更新时间", auto_now=True)
class OrderItem(models.Model):
order = models.ForeignKey(Order, related_name='order_items', on_delete=models.CASCADE, verbose_name="所属订单")
product = models.ForeignKey(Product, related_name='product_items', on_delete=models.CASCADE, verbose_name="订购产品")
quantity = models.PositiveIntegerField("订购数量", default=1)
在项目目录下打开命令行窗口, 使用以下命令创建models.py对应的表
python3 manage.py makemigrations
python3 manage.py migrate
使用以下命令创建超级用户
python3 manage.py createsuperuser
输入用户名/邮箱/密码(两遍)创建超级用户
6.1 为每个数据模型建立对应的序列化器#
每一个Model实际上都是一个Python类的对象, 对象一般只能存活于内存中,想要进行保存和传输(作为响应返回), 我们一般需要将对象转化为字符串, 这称之为序列化
由于每个Model对象的结构不同, 我们要为每个对象建立对应的序列化器(用于将该Model对象转为字符串)
在shop应用目录下新建文件夹api, 在api下新建serializers.py,用于存放所有Model的序列化器, 内容如下:
from rest_framework import serializers
from ..models import Category, Product, Order, OrderItem
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category # 要序列化的模型
fields = '__all__' # 要序列化的字段
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
class OrderSerializer(serializers.ModelSerializer):
class Meta:
model = Order
fields = '__all__'
class OrderItemSerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = '__all__'
默认情况下, 每个Model都可以采用同样的套路, 复制粘贴修改即可
6.2 为每个模型建立对应的Restful Api#
在标准的Restful Api模式中, 每个Model建立两个接口:
from rest_framework import generics
from .serializers import CategorySerializer, ProductSerializer, OrderSerializer, OrderItemSerializer
from ..models import Category, Product, Order, OrderItem
class CategoryList(generics.ListCreateAPIView):
queryset = Category.objects.all()
serializer_class = CategorySerializer
class CategoryDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Category.objects.all()
serializer_class = CategorySerializer
class ProductList(generics.ListCreateAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
class ProductDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
class OrderList(generics.ListCreateAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
class OrderDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
class OrderItemList(generics.ListCreateAPIView):
queryset = OrderItem.objects.all()
serializer_class = OrderItemSerializer
class OrderItemDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = OrderItem.objects.all()
serializer_class = OrderItemSerializer
套路同样一致, 复制粘贴修改即可
generics还支持各种单独的方法, 详见generics源码(Pycharm中按住Ctrl点击generics)
6.3 为接口挂载接口地址
在shop/api/下新建urls.py, 用于存放本应用api的接口地址, 每个Model格式一样, 内容如下:
from django.urls import path
from . import views
app_name = 'shop' # 指定命名空间
urlpatterns = [
path('categories/', views.CategoryList.as_view(), name='category_list'),
path('categories//', views.CategoryDetail.as_view(), name='category_detail'),
path('products/', views.ProductList.as_view(), name='product_list'),
path('products//', views.ProductDetail.as_view(), name='product_detail'),
path('orders/', views.OrderList.as_view(), name='order_list'),
path('orders//', views.OrderDetail.as_view(), name='order_detail'),
path('order_items/', views.OrderItemList.as_view(), name='order_item_list'),
path('order_items//', views.OrderItemDetail.as_view(), name='order_item_detail'),
]
将应用api的接口地址挂在到项目的总路由下
修改项目路径django_shop目录下的urls.py, 内容如下:
from django.contrib import admin
from django.urls import path, include # 在原有的基础上增加导入include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/shop/', include('shop.api.urls', namespace='shop')), # 增加该行
]
在项目路径下打开命令窗口, 运行 python3 manage.py runserver
启动开发服务器
打开网页访问: http://127.0.0.1:8000/api/shop/categories/
即可看到分类列表接口(其他列表接口同理修改url即可, 如.../api/shop/projects/)
当前尚无数据(非登录状态无权限修改数据)
访问: http://127.0.0.1:8000/admin/ 使用超级管理员登录,并重新回到接口页面, 可使用POST创建新数据, 如下图:
创建后重新刷新页面(分类列表接口)即可看到创建的数据
分类详情接口, 访问: http://127.0.0.1:8000/api/shop/categories/1/
注意, 列表和详情统一使用复数categories, 1为该分类的id
使用Postman测试Api
注: 本次搭建的是通用的增删改查接口, 一般还需要根据项目实际需要进行添加和修改
下一节带着大家从Models 10分钟快速定制一套Admin后台系统
PS: 虽然标题是10分钟搭建一套Restful Api接口, 如有什么其他想学的教程也可留言给我
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。
如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步
在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。
我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,