DRF+Vue.JS前后端分离项目实例(上):使用 Django-Rest-Framework快速实现 RESTful API 接口编程

news2024/11/17 3:45:18

在这里插入图片描述

1. RESTFul API 接口需求及设计

本文以学生信息查询功能为例,采用前后端分离架构,要求后端提供RESTFul 接口。

1.1 本例要求提供如下查询功能:

  • 列表查询、单条查询
  • 添加学生信息
  • 更改学生信息
  • 删除学生信息

1.2 数据库student表结构如下:

字段类型长度说明
namestring30学生姓名
nostring10学号
gendertiny int10: 男, 1: 女
ageint4年龄
class_namestring30班级名称
scoreint4成绩

1.3 按REST接口指导原则, RESTFul 风格API 设计如下

在开始之前,推荐阅读 REST接口基本原理

操作请求类型资源请求url请求数据
列表查询GEThttp://127.0.0.1:8000/student/
单条查询GEThttp://127.0.0.1:8000/student/1/
添加记录POSThttp://127.0.0.1:8000/student/2/{‘name’:‘Jack’, ‘no’:‘A001’,…}
更改记录PUThttp://127.0.0.1:8000/student/2/{‘name’:‘Jack’, ‘no’:‘B001’,…}
删除记录DELETEhttp://127.0.0.1:8000/student/2/

注意,RESTFul风格url 不需要在 url中添加操作动词,如 http://127.0.0.1:8000/student/list/。 当然这样做也可以,只是推荐方式更简洁。

2. 为什么使用Django-rest-framework来开发RESTful API?

Django 是最流行的Python Web开发框架,本身提供了ORM 数据库封装、模板、视图、路由、权限与鉴权, 管理后台等完整的工具链,各种功能开箱即用。 django-rest-framework (简称DRF) 继承了django框架的上述优点,开发与部署不需要第3方库的支持就可以轻松完成数据库CRUD的 REST API开发,并提供完善的鉴权、分级权限控制、测试页面等功能,可以快速地开发出一套高质量的REST API。

其它的框架,如 Flask-Rest,实际应用时,还需要集成数据接口库、鉴权、权限管理等第3方库来完成,测试也需要第3方工具支持,在集成配置,代码质量控制上,难度显然增大了,最终投入成本往往超过django-rest-framework。当然如果你是有经验的Flask开发人员则另当别论。

3. 创建django 项目

3.1 安装 django-rest-framework

创建与激活虚拟环境

python3 -m venv env_rest
cd env_rest
.\script\activate   # 激活虚拟环境

pip install django
pip install djangorestframework

在linux下激活虚拟环境命令为

source env_test/bin/activate 

安装django-rest-framework

pip install django
pip install djangorestframework

3.2 创建django 项目与应用

新建1个项目

django-admin startproject RestTutorial

在RestTutorial 项目下,新建1个app

cd RestTutorial
python manage.py startapp student_rest

3.3 修改全局配置

打开RestTutorial/RestTutorial/settings.py 文件,添加以下配置

INSTALLED_APPS = [
    ...
    'rest_framework',   # 导入DRF库
    ‘student_rest’,    # 导入新建app
]

# 设置分页器
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}


将语言与时区修改为中国的

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_TZ = False

3.4 准备model

django默认使用sqlite3 数据库, 你可以将数据库后端 改为mysql, postgreSql 等你熟悉的数据库,细节略过。

**定义Student Model **

打开文件 RestTutorial/student_rest/models.py, 输入以下代码

from django.db import models
from django.urls import reverse


# 学生信息model 定义
class Student(models.Model):
    name = models.CharField(max_length=30,verbose_name="姓名")
    no = models.CharField(max_length=10,verbose_name="学号")    
    gender = models.IntegerField(max_length=10,verbose_name="性别")
    age = models.IntegerField(verbose_name="年龄")
    class_name = models.CharField(max_length=30,verbose_name="班级")
    score = models.IntegerField(verbose_name="成绩")

    def __str__(self) -> str:
        return self.name

    class Meta:
        db_table = "student"
        managed = True
        verbose_name = "学生表"
        verbose_name_plural = verbose_name
        unique_together = ['no']

模型定义好以后,需要更新数据库。

python manage.py makemigrations
python manage.py migrate  

3.5 将 Student 模型加入到管理后台

为了添加数据方便,可以将新建的model 添加到django管理后台,添加初始数据更加方便

打开 RestTutorial/student_rest/admins.py 文件,添加如下代码

from django.contrib import admin
from .models import *

# Register your models here.

class StudentAdmin(admin.ModelAdmin):
    list_display = ['id','name','no','gender','age','class_name','score']
    list_per_page = 10
    
admin.site.register(Student, StudentAdmin)   

3.6 启动项目,添加初始数据

创建1个管理员帐号,并启动项目:

python manage.py createsuperuser 
python manage.py runserver 0.0.0.0:8000

如下出现如下信息,就表示运行成功

System check identified 1 issue (0 silenced).
July 06, 2023 - 13:52:06
Django version 3.2.8, using settings 'RestTutorial.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CTRL-BREAK.

打开浏览器,输入 http://127.0.0.1:8000/admin/ ,登录后,进入管理后台。

打开学生表,添加初始数据,
在这里插入图片描述

4. DRF编程实现RESTful 接口

DRF 编程很关键的一步是定义Serializer 类,用于将 model 数据序列化。其使用方式与django Form 表单非常相似。
DRF 视图可采用函数式编程,或Class Based View(CBV)视图类的方式编程,并且DRF内置了各种通用视图类来简化编程。

4.1 自定义Serializer 类

新建文件: tutorial/student_rest/serializers.py,, 输入以下代码

from rest_framework import serializers
from .models import Student


class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = "__all__"

4.2 用函数式编程实现视图功能

DRF对视图编程,提供了@api_view() 装饰器来实现函数式编程,通常响应仅提供Json字节串,不提供DRF特有的接口测试页面功能。
打开 RestTutorial/student_rest/views.py, 文件,输出以下代码

from django.shortcuts import render
from django.http import JsonResponse, HttpResponse
from rest_framework.parsers import JSONParser
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view
from rest_framework import status
from .models import Student
from .serializers import StudentSerializer


# Create your views here.

# @csrf_exempt
@api_view(['GET','POST'])
def student_list(request):
    if request.method == 'GET':
        # 获取所有数据步骤: 1.获取数据 2.序列化 3.用json格式发送数据
        qs = Student.objects.all()
        serilizer = StudentSerializer(qs, many=True)
        print(serilizer.data)
        return JsonResponse(serilizer.data, safe=False)
    elif request.method =='POST':
        # 新增一条数据的步骤: 1.获取数据 2.反序列化 3.保存至数据库 4.发送结果 
        data = JSONParser().parse(request)
        serilizer = StudentSerializer(data=data)
        if serilizer.is_valid():
            serilizer.save()
            return JsonResponse(serilizer.data, status=status.HTTP_201_CREATED)
        return JsonResponse(serilizer.errors, status=status.HTTP_400_BAD_REQUEST)

def student_detail(request,pk):
    # retrieve, update or delete a row of student model 
    
    # 读取单条数据
    try: 
        row = Student.objects.get(pk=pk)
    except Student.DoesNotExist:
        return HttpResponse(status=status.HTTP_404_NOT_FOUND)
    
    if request.method == 'GET':
        serializer = StudentSerializer(row)
        return JsonResponse(serializer.data)
    elif request.method == 'PUT':
        input_data = JSONParser().parse(request)
        serializer = StudentSerializer(row, data=input_data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=status.HTTP_200_OK)
    elif request.method == 'DELETE':
        row.delete()
        return HttpResponse(status=status.HTTP_204_NO_CONTENT)

打开 tutorial/student_rest/urls.py, 输入


from django.urls import path
from student_rest import views, views_cbv


urlpatterns = [
    path('v1/', views.student_list),             # 用于函数式View测试, list, create
    path('v1/<int:pk>/', views.student_detail),  # 用于函数式View测试, retrieve, update, delete

]

url中加入了v1/主要是为了与下一章CBV视图类路由做个区分。
在打开项目的路由本置文件 RestTutorial/RestTutorial/urls.py, 加入一条路由

from django.contrib import admin
from django.urls import path,include
from student_rest import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('student/', include('student_rest.urls')),
]

4.3 运行并验证

运行项目,
python manage.py runserver 0.0.0.0:8000

前面提到过, 函数式编程不提供测试界面,因此测试接口需要使用第3方工具。
由于浏览器无法发送 post, put, delete消息, 因此建议使用postman 或 curl 等工具来测试
打开postman, 查询所有记录:GET http://127.0.0.1:8000/student/v1/,
在这里插入图片描述
测试 添加数据的接口: POST http://127.0.0.1:8000/student/v1/
注意, body 选择raw, json, 手工输入要添加的数据,json格式。
在这里插入图片描述
再用list 接口查询,可以看到数据已添加成功。

5. 使用视图类实现REST API

DRF的函数式编程,相对于其它编程语言已经非常简便了。 但前一章可以看出,post, put 实际上还要做校验与保存等工作,delete要做删除等动作,实际应用时可能更多。如果有多个模式,每个类都要写重复语句。为节省这些精力,DRF提供了视图类,混入类来帮助简化编程,同时还提供了测试界面的功能。

5.1 CBV 视图类实现代码

下面我们新建1个文件 RestTutorial/student_rest/views_cbv.py, 输入以下代码

from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from .models import Student
from .serializers import StudentSerializer
from rest_framework import generics
from rest_framework.permissions import IsAdminUser

class StudentList(generics.ListCreateAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

class StudentDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

非常简洁地就实现了第4章的全部功能。 下面为新的视图类添加路由;
打开 tutorial/student_rest/urls.py, 添加

    path("v2/", views_cbv.StudentList.as_view()), # 用于Class-based View测试, list, create
    path("v2/<int:pk>/", views_cbv.StudentDetail.as_view()), # 用于Class-based View测试, retrieve, update, delete

5.2 验证

再次运行项目, 这次不需要第3方工具,就可以进行完整测试
打开浏览器, 输入 http://127.0.0.1:8000/student/v2/ , 页面显示如下:
在这里插入图片描述
页面最下方提供了添加学习数据的post接口测试功能。

再打开detail view 页面,如http://127.0.0.1:8000/student/v2/6/, 页面如下:
在这里插入图片描述
页面下方,是 PUT更改数据的测试接口,上方有delete 按钮,用于测试delete 接口。 接口数据显示也非常友好,也便于前端开发人员阅读。

对于较正式的项目,本人推荐使用django test模块,编写自动化测试脚本,也不需要selenium等第3方测试工具支持。

总结

使用 django-rest-framework 开发基于数据库CRUD的 REST API, 提供完整的内置工具箱,便得整个开发以及测试过程方便快捷,同时,django提供了强大的扩展功能,对于项目的后期扩展、维护也带来了便利。
因此,使用 django-rest-framework 框架进行REST API开发,是中小项目非常不错的选择。

完整项目代码: 点击下载

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

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

相关文章

2.3 Web应用 -1 web 应用概述

2.3 Web应用 -1 web 应用概述 Web与HTTPHTTP协议概述 Web与HTTP World Wide Web: Tim Berners-Lee 网页网页互相链接 网页(Web Page)包含多个对象(objects) 对象&#xff1a;HTML文件、JPEG图片、视频文件、动态脚本等基本HTML文件&#xff1a;包含对其他对象引用的链接 对象的…

ValueError: No engine for filetype: ‘‘

目录 pandas 导出数据时报错 解决办法 很简单的原因&#xff0c;一开始我直接百度&#xff0c;发现没有搜到结果&#xff0c;在此记录一下 保存时&#xff0c;文件名结尾没加xlsx&#xff01;&#xff01;&#xff01; 保存其他格式时&#xff0c;文件名里也要记得加上对应后缀…

【C语言进阶(五)】指针进阶详解(上)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 指针进阶 1. 前言 2. 字符指针 2.…

一个 NPM 包,帮助数十万程序员提高数十倍效率,难道不开源出来?(一)

我就知道你会点进来看看&#xff0c;吹牛逼的&#xff0c;哈哈&#xff0c;不过呢&#xff0c;我正在朝着这个方向前进&#xff0c;希望大家给我鼓励鼓励&#xff0c;希望点击进来小伙伴点点赞&#xff0c;点点关注。 说实话&#xff0c;写这个项目的目的&#xff0c;从我自己写…

ANSYS ACT插件开发基本流程

开发实施路线 以ACT仿真向导的开发为例&#xff0c;整体可以分为IronPython脚本开发和XML界面开发两个阶段&#xff1b;实际上所有的ANSYS产品的仿真向导开发都是遵循相同的路线流程。此外&#xff0c;另外两种类型的ACT插件开发路线亦是如此。 如何去学习 脚本开发是ACT插件…

再度进化,ChatGLM2-6B详细学习实践记录与资料分享

ChatGLM-6B是清华大学基础研究团队前一段时间开源出来的大模型&#xff0c;一经推出就得到了广泛的使用和推广&#xff0c;在我前面的博文中结合我自己的学习实践经历&#xff0c;已经详细的总结记录了一下&#xff0c;感兴趣或者是有需要的朋友可以自行获取即可&#xff0c;如…

【Linux】-Linux基本指令

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Linux】 分享: 屋檐如悬崖 风铃如沧海 我等燕归来 时间被安排 演一场意外 你悄然走开 故事在城外 浓雾散不开 看不清对白 你听不出来 风声不存在 是我在感慨 梦想来是谁在窗台 …

初步尝试调试postgresql源码

准备用VS2005和postgresql 8.x或9.0&#xff0c;搭建源码调试环境&#xff1b; 不成功&#xff1b;结果如下&#xff1b; 把下面文件中用#连着注释掉7行&#xff0c;然后加上一句 $self->{vcver} 8.00; 得到上面结果&#xff1b;如果不改的话上面的结果也没有&#xff1b;…

恒生电子探路金融大模型

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 近日&#xff0c;恒生电子和旗下子公司恒生聚源正式发布基于大语言模型技术打造的数智金融新品&#xff1a;金融智能助手光子和全新升级的智能投研平台WarrenQ。此外&#xff0c;恒生电子金融行业大模型LightGPT也首次对外亮…

硬件电路设计--运算放大器(三)应用一

文章目录 前言示例1示例2 一、反向比例反向比例改进版对平衡电阻R的讨论 二、同向比例三、电压跟随器四、加法运算电路4.1 反向加法电路4.2 同加法电路4.3 特殊应用 五、减法运算电路六、积分电路七、微分电路八、对数和指数运算电路8.1 对数8.2 指数 九、测量放大电路&#xf…

基于matlab根据一系列图像估计单个校准相机的轨迹(附源码)

一、前言 视觉里程计是通过分析一系列图像来确定相机的位置和方向的过程。视觉里程计用于各种应用&#xff0c;例如移动机器人、自动驾驶汽车和无人机。此示例说明如何根据一系列图像估计单个校准相机的轨迹。 此示例演示如何从一系列二维视图估计校准相机的轨迹。此示例使用…

常用字符串处理方法汇总--Pandas

字符串处理只能在Series上进行&#xff0c;不可以在DataFrame上操作&#xff0c;只能对字符串进行处理&#xff0c;不能对整数、日期进行处理 1. 元素统计 1.1 str.count() 1.1.1 函数功能 统计Series中每个元素中包含pat的次数 1.1.2 函数语法 Series.str.count(pat, fl…

美日韩限制光刻机供应,中国正式亮剑,外媒:轮到美芯被卡脖子了

这几年美国频频对中国芯片采取措施&#xff0c;今年以来美国更是变本加厉&#xff0c;联合荷兰和日本限制对中国出售光刻机等芯片设备&#xff0c;试图将中国的芯片工艺限制在45纳米以上&#xff0c;近日我国商务部联合海关等部门宣布对镓、锗等稀有金属实施出口限制&#xff0…

Python实现某只股票的MACD、KDJ指标的单双金叉点判定

金叉理论介绍 在股票K线图中&#xff0c;短期的收盘价均线向上穿越长期均线即为金叉&#xff0c;但如果长期均线向下或变缓&#xff0c;同时短期均线向上穿越就不能称之为金叉。 对于MACD指标&#xff0c;若差离值线由下向上突破移动平均线&#xff0c;即DIF值前一天小于DEA值…

MySQL库表操作的作业

1.创建数据库 create database Market&#xff1b; mysql> show databases; -------------------- | Database | -------------------- | information_schema | | Market | | db1 | | mysql | | performance_schema | | …

消息队列 - RocketMQ

1. 名词解释和概念 NameServer&#xff1a; 是一个无状态节点&#xff0c;可集群部署&#xff0c;节点之间无任何信息同步用于服务注册和发现&#xff0c;为 MQ 集群提供服务协调与治理记录并维护 Topic 和 Broker 的信息为生产者和消费者提供 Topic 的路由信息 无状态和有状…

On the Properties of Neural Machine Translation: Encoder–DecoderApproaches

摘要 Neural machine translation &#xff1a; 神经机器翻译。 神经机器翻译模型经常包含编码器和解码器&#xff1a;an encoder and a decoder. 编码器&#xff1a; 从一个变长输入序列中提取固定长度的表示。a fixed-length representation. 解码器&#xff1a;从表示中…

抖音SEO矩阵系统源码开发部署(二)技术搭建+二次开发

抖音SEO矩阵系统源码开发 是一项技术密集型工作&#xff0c;需要对大数据处理、人工智能等领域有深入了解。该系统开发过程中需要用到多种编程语言&#xff0c;如Java、Python等。同时&#xff0c;需要使用一些框架和技术&#xff0c;如Hadoop、Spark、PyTorch等&#xff0c;以…

第五章 运输层【计算机网络】

第五章 运输层【计算机网络】 前言推荐第五章 运输层5.1运输层协议概述5.1.1 进程之间的通信5.1.2运输层的两个主要协议5.1.3运输层的端口 5.2用户数据报协议UDP5.2.1UDP概述5.2.2UDP的首部格式 5.3传输控制协议TCP概述5.3.1TCP最主要的特点5.3.2TCP的连接 5.4可靠传输的工作原…

手写操作系统--进入保护模式的开篇

之前我们讲的主引导扇区以及内核加载器等内容。都是在实模式下运行的。在实模式下寻址范围仅有1M&#xff0c;是远远不够我们用的。我们想要更大的内存空间&#xff0c;就得进入保护模式&#xff0c;实模式是一个历史遗留问题&#xff0c;本身是没有这个名字的。是因为有了保护…