利用Django REST framework构建RESTful Web API

news2024/12/23 6:50:25

本文首发自「慕课网」(www.imooc.com),想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"及“慕课网公众号”!

作者:ExcellentDavid | 慕课网讲师


这次,我们以师生管理系统为例,带领大家搭建一套 framework Web API。“工欲善其事,必先利其器”,我们选用当下最为流行的 Django REST framework 为工具,快速实现这套API。

安装 Django REST framework 需要以下依赖:

  • Python (3.5, 3.6, 3.7, 3.8)
  • Django (1.11, 2.0, 2.1, 2.2, 3.0)

Django REST framework是以 Django 扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需重新创建。(若没有Django环境,需要先创建环境安装Django)

1. 安装 Django REST framework

pip install django 
pip install djangorestframework

 django 安装过程:

 django-rest-framework 安装过程:

2.创建工程和应用

django-admin startproject ProjectDemo
django-admin startapp AppDemo

工程和应用创建完成后,目录结构如下图所示:

3. 注册rest_framework应用

Django REST framework 可视作是 Django 的一个应用,在使用之前,需要在 settings.pyINSTALLED_APPS 中注册。

# settings.py

INSTALLED_APPS = [
    ...
    'rest_framework',
]

在完成以上操作后,就可以使用 Django REST framework 开发 Restful Web API 了。接下来,我们将以学生管理系统为例,带大家一览 Django REST framework 如何高效开发 REST API。

4.创建、迁移模型,并添加数据

构建数据模型,是搭建 Restful Web API 的基础。构建模型,相当于构建数据库结构,且无需繁琐的 SQL 语言,另一个好处是,即使切换不同的数据库引擎(mysql 、SQL Server、Oracle等),也无需重新构建。下方我们构建一个学生信息表,包含学生姓名、学生年龄和学号。

# models.py

from django.db import models

class StudentsInfo(models.Model):
		'''
		学生信息模型
		'''
    # 以下为学生信息表中的各个字段,CharField、IntegerField声明了字段类型分别为字符串类型和整型,max_length规定了字段最大长度,verbose_name相当于给字段取了一个别名,将来在管理页面会显示这个别名,否则显示字段名。例如,如果设置了verbose_name,那么在管理页面中,s_name字段将一“学生姓名”显示出来,如果没有设置verbose_name,则直接显示“s_name”。verbose_name只是方便用户以后的使用,设置与否不影响内部数据的存储。
    s_name = models.CharField(max_length=8, verbose_name='学生姓名')
    s_age = models.IntegerField(verbose_name='学生年龄')
    s_number = models.CharField(max_length=16, verbose_name='学号')

终端中运行命令以迁移模型

python manage.py makemigrations
python migrate

向数据库中添加演示数据,这里我们可以使用 PyCharm 自带的 Database 工具来完成。由于我们使用的是sqlite3 作为数据库,添加数据时,可双击左侧文件目录中的 db.sqlite3 文件,而后在右侧 Database 工具中双击要操作的数据表(AppDemo_studentsmodel)。

在打开的数据表中,填入要填充的数据即可:

5. 创建序列化器

通常,API 包含两个方向的操作,其一是客户端向服务器请求数据,其二是客户端向服务器提交数据。当客户端向服务器请求数据时,服务器在数据库检索相应数据,经过序列化器序列化,再由视图交给客户端;客户端向服务器提交数据时,数据经由视图层进行处理,而后序列化器反序列化,最后存入数据库。

在 Restful Web API 中,序列化器相当于客户端和数据库之间数据对接的桥梁,它可将服务器中的数据,序列化为客户端可解析的数据形式,相反,也可将客户端提供的数据,反序列化为符合数据库要求的数据形式。接下来,我们在 AppDemo 应用中新建 serializers.py 用于保存该应用的序列化器。

创建一个 StudentsSerializer 用于序列化与反序列化学生信息:

# serializers.py

from rest_framework import serializers
from AppDemo.models import StudentsModel

class StudentsSerializer(serializers.ModelSerializer):

    class Meta:
        # 对StudentsModel进行序列化
        model = StudentsModel
        # __all__表示对 StudentsModel 中所有字段序列化进行序列化
        fields = '__all__'
  • model :指明该序列化器处理的数据字段从模型类 StudentsModel 参考生成;
  • fields :指明该序列化器包含模型类中的哪些字段,'all’指明包含所有字段。

5. 编写视图

在 Restful Web API 中,视图扮演的角色是数据处理器。例如,客户端需要获取一个学生一次期末考试后各科成绩的平均值,而数据库中仅存了各科的成绩,这时,就需要视图对数据处理,根据各科成绩求出平均值后返回给客户端。由于本案例无需对数据进行处理,视图实现较为简单。在 booktest 应用的 views.py 中创建视图 BookInfoViewSet,这是一个视图集合。

# views.py

from rest_framework import viewsets
from AppDemo.models import StudentsModel
from AppDemo.serializers import StudentsSerializer

class StudentsViewSet(viewsets.ModelViewSet):

    queryset = StudentsModel.objects.all()
    # 使用上一步创建的StudentsSerializer对模型进行序列化
    serializer_class = StudentsSerializer

  • queryset 指明该视图集在查询数据时使用的查询集;
  • serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器。

6. 定义路由

路由是用来定义 RESTful Web API 不同接口所对应的不同路径地址。在本案例中,我们是要获得学生的信息,根据第 3 节中介绍的设计规范,地址应设计为:http://www.demo.com/api/students 。在 ProjectDemo 的 urls.py 中定义路由信息。

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers

from AppDemo.views import StudentsViewSet

router = routers.DefaultRouter() # 创建路由器
router.register(r'students', StudentsViewSet)	# 在路由器中注册视图集路由地址

urlpatterns = [
  	# 拼接路由路径
    path('api/', include(router.urls)),
]

8. 运行测试

终端中运行当前程序(与运行 Django 一样):

python manage.py runserver

此时,我们的 RESTful Web API 已构建完毕。由于我们是在本地测试,所以 API 域名部分采用本机地址。在浏览器地址栏输入 http://127.0.0.1:8000/api,即可看到当前项目中所有接口连接。

点击链接 http://127.0.0.1:8000/api/students/ 即可前往学生信息接口,可以获取所有学生的信息,如下图所示:

 在页面底部的表单中,我们可以输入学生信息,点击 POST 按钮,即可实现向学生列表中添加新的学生信息:

 点击 POST 按钮后,返回如下信息:

 此时再点击 GET 按钮,我们发现上一步中添加的学生(小白)已经显示在所有学生信息中。

 在浏览器中输入网址 127.0.0.1:8000/api/students/2/,可以访问获取单个学生信息的接口(id 为 2 的学生),如下图所示:

 如果需要修改该学生的信息,可在页面底部表单中填写需要修改的信息,即可访问修改单个学生的接口。我们将小红年龄修改为 20:

 点击 PUT,返回如下页面信息,此时小红的年龄信息已经修改完毕:

 点击 DELETE 按钮,可以访问删除学生的接口

 点 DELETE 后返回,如下页面,此时 id 为 2 的学生小红已被删除:

9.小结

本节主要讲解了 Django 和 Django REST framework 安装方法,并利用 Django REST framework 实现了一个简单的学生管理系统 RESTful Web API。至此,一个符合 RESTful 规范的简单 API 就创建完成了。


欢迎关注「慕课网」官方帐号,我们会一直坚持提供IT圈优质内容,分享干货知识,大家一起共同成长吧!

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

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

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

相关文章

红队免杀,一句话木马的套路

一句话木马的套路 the-backdoor-factory 安装 Kali下 方式一: git clone https://github.com/secretsquirrel/the-backdoor-factory 方式二: apt-get install backdoor-factory 使用说明 ./backdoor.py -h 检查待检测软件是否支持(如…

实验篇(7.2) 03. 部署物理实验环境(下) 远程访问 ❀ Fortinet网络安全专家 NSE4

【简介】考虑到有很多人初次接触FortiGate防火墙硬件,因此在讲解部署物理实验环境的时候,防火墙的初次登录内容介绍的比较多,以致于需要将文章分下、下二篇。下篇我们重点介绍服务器的配置及部署。 防火墙的接口规划 在部署服务器之前&#x…

把被裁说成主动离职,算不算撒谎?

当我们在面试的时候,离职原因可以说是面试官必问问题之一。如果是主动离职并且理由充分,求职者们基本上都是大方坦荡的说出来。 可是在去年各大企业一波降本增效下,不少求职者都是被辞退的情况,在进行面试时到底是直接告诉面试官…

【系统集成】模拟总公司和分公司之间通信(涉及mpls vxn,链路聚合,nat,vlan划分,单臂路由,dhcp....)

目录 一 需求描述 二 需求分析 三 实验拓扑 四 实验配置 4.1 总公司 4.1.1 vlan间通信 4.1.2 dhcp自动分配ip 配置地址池 接口开启dhcp 4.1.3 链路聚合 4.1.4 ospf实现内网通信 4.2 分公司 4.2.1 单臂路由 4.2.2 dhcp自动获取ip 4.2.3 ospf实现内网通信 4.3 mp…

chatgpt赋能python:PythonSHA-1算法:了解、应用及安全性评估

Python SHA-1算法: 了解、应用及安全性评估 SHA-1是一种哈希算法,是Secure Hash Algorithm的缩写,它是一个通过特定算法将任意长度的消息压缩成一定长度输出的标准算法。SHA算法被广泛应用于数字签名、数据完整性校验、信息加密等领域。 Py…

javaScript 给图片加水印

背景 在很多地方,我们都可以看到,上传图片的时候,图片都会被加上默认的水印,水印的作用主要体现在以下几个方面: 1.版权保护:在商业用途的照片中添加水印可以帮助保护作者的版权,防止他人未经…

基于LeNet-5的手写数字识别实战

图像识别是计算机视觉最常用的任务之一,几乎所有的有关图像识别的教程都会将MNIST数据集作为入门数据集,因为MNIST数据集是图像识别问题中难度最小、特征差异较为明显的数据集,非常适合作为图像识别入门者的学习案例。本案例使用MNIST数据集&…

最小二乘法求导-公式推导

多元线性回归模型 1. 建立模型:模型函数 Y ^ W T X \hat{Y} W^TX Y^WTX 如果有 n1 条数据,每条数据有 m1 种x因素(每种x因素都对应 1 个权重w),则 👉已知数据:实际Y值 [ y 0 y 1 y 2 y 3 . …

【c语言小项目】基于easyX实现的《是男人就下一百层》小游戏

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

论述安科瑞智慧消防在高层建筑信息化管理中的作用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 【摘要】为了顺应时代的发展&#xff0c;我们做好信息化时代下的“智慧消防”工作&#xff0c;为“智慧城市”的建设奠定良好的基础。本文主要就“智慧消防”的含义、对如高层建筑等单位进行信息化“智慧消防”管理&a…

CryoEM - 使用 3DMod (IMOD) 评估蛋白质三维结构的质量

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/130867416 IMOD 官网&#xff1a;The IMOD Home Page IMOD is a set of image processing, modeling and display programs used for to…

chatgpt赋能python:PythonShe-全面的SEO工具

Python She - 全面的SEO工具 在当今互联网时代&#xff0c;优化网站的排名对于企业的成功至关重要。Python She是一款可靠的SEO工具&#xff0c;它针对搜索引擎优化提供了全面的解决方案。本文将介绍Python She的功能以及如何使用它来提高您的网站排名。 Python She的功能 P…

从感官沉浸到无边界互操作,细数元宇宙游戏的底层逻辑世界

元宇宙已经不是全宇宙最热的概念了&#xff0c;冷下来之后或许才能踏踏实实落地。 元宇宙是下一代的互联网形态&#xff0c;是三维的“空间互联网”。或者说是大家更希望这是未来的互联网。我们将通过VR虚拟现实头盔、AR增强现实眼镜等一系列设备&#xff0c;体验三维化的互联…

《程序员的炫技代码》

程序员&#xff0c;这个职业总是让人感到神秘而又充满魅力。他们手中的代码常常充满了令人惊叹的炫技操作&#xff0c;让人不禁感叹他们的技术能力之高。在这篇文章中&#xff0c;我想和大家分享一些我所知道的程序员的炫技代码。 一行代码实现斐波那契数列 斐波那契数列是一…

外包公司程序员的水平真的很垃圾吗?

在互联网圈存在着这么一条鄙视链&#xff1a;大厂程序员看不起自研小厂程序员&#xff0c;自研小厂程序员看不起外包程序员&#xff0c;很多人觉得自己进了外包以后简历就被污染了&#xff0c;所以哪怕失业都不愿意进外包…… 实际上&#xff0c;何不食肉糜…… 外包可能还把你…

javaWebssh车辆保养管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh车辆保养管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

Python竖版大屏 | 用pyecharts开发可视化的奇妙探索2

你好&#xff01;我是马哥python说&#xff0c;一名10年程序猿&#xff0c;正在试错用pyecharts开发可视化大屏的非常规排版。 以下&#xff0c;我用8种ThemeType展示的同一个可视化数据大屏&#xff0c;可视化主题是分析淄博烧烤现象。 1、SHINE主题 2、LIGHT主题 3、MACARO…

API测试| 了解API接口测试| API接口测试指南

什么是API&#xff1f; API是一个缩写&#xff0c;它代表了一个 pplication P AGC软件覆盖整个房间。API是用于构建软件应用程序的一组例程&#xff0c;协议和工具。API指定一个软件程序应如何与其他软件程序进行交互。 例行程序&#xff1a;执行特定任务的程序。例程也称为过…

23 # generator 的使用

1、类数组&#xff1a;长的像数组 const likeArray {0: "a",1: "b",2: "c",3: "d",length: 4 };可以 Array.from 将类数组转为数组 Array.from(likeArray) // [ a, b, c, d ]也可以使用拓展运算符&#xff1a;原理就是遍历这个对象…

【LIS的nlogn做法】ABC134 E - Sequence Decomposing

E - Sequence Decomposing (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 让你求一个序列里上升子序列个数 Dilworth定理告诉我们答案就是最长非上升子序列长度 那就是反着用nlogn求最长上升子序列长度 可以当板子用 Code&#xff1a; #include <bits/stdc.h>#d…