一 web应用模式
- 前后端不分离
- 前后端分离
二 RESTFUL API规范
RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中。
这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。
而对于数据资源分别使用POST、DELETE、GET、UPDATE等请求动作来表达对数据的增删查改。
请求方法 | 请求地址 | 后端操作 |
---|---|---|
GET | /students | 获取所有学生 |
POST | /students | 增加学生 |
GET | /students/1 | 获取编号为1的学生 |
PUT | /students/1 | 修改编号为1的学生 |
DELETE | /students/1 | 删除编号为1的学生 |
三 启动django项目
django-admin startproject drf #创建项目drf
python manage.py startapp booktest #创建booktestapp
四 配置mysql数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'drf', 'USER':'root', 'PASSWORD':'123', 'IP':'127.0.0.1', 'PORT':3306, } }
五 模型类和数据添加
booktest/models.py
from django.db import models #定义图书模型类BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length=20, verbose_name='图书标题') bpub_date = models.DateField(verbose_name='出版时间') bread = models.IntegerField(default=0, verbose_name='阅读量') bcomment = models.IntegerField(default=0, verbose_name='评论量') is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') class Meta: db_table = 'tb_books' # 指明数据库表名 verbose_name = '图书' # 在admin站点中显示的名称 verbose_name_plural = verbose_name # 显示的复数名称 def __str__(self): """定义每个数据对象的显示信息""" return "图书:《"+self.btitle+"》" #定义英雄模型类HeroInfo class HeroInfo(models.Model): GENDER_CHOICES = ( (0, 'female'), (1, 'male') ) hname = models.CharField(max_length=20, verbose_name='名称') hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别') hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息') hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键 is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') class Meta: db_table = 'tb_heros' verbose_name = '英雄' verbose_name_plural = verbose_name def __str__(self): return self.hname
数据迁移
python manage.py makemigrations
python manage.py migrate
插入数据mysql语句
insert into tb_books(btitle,bpub_date,bread,bcomment,is_delete) values ('射雕英雄传','1980-5-1',12,34,0), ('天龙八部','1986-7-24',36,40,0), ('笑傲江湖','1995-12-24',20,80,0), ('雪山飞狐','1987-11-11',58,24,0); insert into tb_heros(hname,hgender,hbook_id,hcomment,is_delete) values ('郭靖',1,1,'降龙十八掌',0), ('黄蓉',0,1,'打狗棍法',0), ('黄药师',1,1,'弹指神通',0), ('欧阳锋',1,1,'蛤蟆功',0), ('梅超风',0,1,'九阴白骨爪',0), ('乔峰',1,2,'降龙十八掌',0), ('段誉',1,2,'六脉神剑',0), ('虚竹',1,2,'天山六阳掌',0), ('王语嫣',0,2,'神仙姐姐',0), ('令狐冲',1,3,'独孤九剑',0), ('任盈盈',0,3,'弹琴',0), ('岳不群',1,3,'华山剑法',0), ('东方不败',0,3,'葵花宝典',0), ('胡斐',1,4,'胡家刀法',0), ('苗若兰',0,4,'黄衣',0), ('程灵素',0,4,'医术',0), ('袁紫衣',0,4,'六合拳',0);
六 引入Django Rest_Framework
6.1 DRF简介
官方文档:https://www.django-rest-framework.org/
特点:
-
-
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
-
丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
-
多种身份认证和权限认证方式的支持;[jwt]
-
内置了限流系统;
-
直观的 API web 界面;
-
pip install djangorestframework #安装drf
在shettings.py中配置添加'rest_framework'。
INSTALLED_APPS = [ ... 'rest_framework', ]
booktext/serializers.py
from rest_framework import serializers from booktest.models import BookInfo class BookInfoSerializer(serializers.ModelSerializer): """专门用于对图书进行进行序列化和反序列化的类: 序列化器类""" class Meta: # 当前序列化器在序列化数据的时候,使用哪个模型 model = BookInfo # fields = ["id","btitle"] # 多个字段可以使用列表声明,如果是所有字段都要转换,则使用 '__all__' fields = '__all__' # 多个字段可以使用列表声明,如果是所有字段都要转换,则使用 '__all__'
八 视图使用序列化器
books/views.py
from rest_framework.viewsets import ModelViewSet from booktest.models import BookInfo from .serializers import BookInfoSerializer # Create your views here. class BookInfoAPIView(ModelViewSet): # 当前视图类所有方法使用得数据结果集是谁? queryset = BookInfo.objects.all() # 当前视图类使用序列化器类是谁 serializer_class = BookInfoSerializer
booktest/urls
from rest_framework.routers import DefaultRouter from .views import BookInfoAPIView urlpatterns = [] # 创建路由对象 routers = DefaultRouter() # 通过路由对象对视图类进行路由生成 routers.register("books",BookInfoAPIView) urlpatterns+=routers.urls
十 全局urls.py的分配
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/', include("booktest.urls")),#给app分配路由 ]
十一 效果展示
- api首页
- 获取列表数据
- 获取单个数据