Django的web框架Django Rest_Framework精讲(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Django的web框架Django Rest_Framework精讲(一)

Django Rest_Framework

1. DRF介绍

Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用,简称DRF。


在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,把queryset类型数据自动转化为json等可以传到前端的数据类型

不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。


REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。

REST framework提供了一个API 的Web可视化界面来方便查看测试接口。


提供了我们写接口便利的方法,把响应的内容,响应的格式,响应状态码都封装好了

不用自己再做这些了,但是能DRF能做的还是有限的,对于复杂的接口还是需要自己来做这些事


restful不是必须的,但是为了后续开发,交接规范,大家约定俗成的使用restful规范

2.DRF特点

提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;

提供了丰富的类视图、Mixin扩展类,简化视图的编写;

丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;

多种身份认证和权限认证方式的支持;[jwt]

内置了限流系统;

直观的 API web 界面;

可扩展性,插件丰富


django restframework(简称drf)本质上其实就是一个别人编写好的app,里面集成了很多编写restful API的功能功能。


其目录中有很多我们以前写django程序见到过的,因为它就是一个别人写好了的app,我们拿来用。


因此 每次新建项目时要记得在settings中注册app。


同时在settings中也要加上如下字典,以后drf相关的全局配置都会在该字典中添加。

3.环境安装与配置

(1)DRF需要以下依赖

  • Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6, 3.11)
  • Django (1.10, 1.11, 2.0, 4.2.1)

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


安装DRF,这是linux安装

前提是已经安装了django,建议安装在虚拟环境

#mkvirtualenv drfdemo -p python3
#pip install django

pip install djangorestframework

Windows就在本地环境中安装

(2)创建django项目


添加rest_framework应用,pycharm创建的项目,默认会把第一个创建的应用添加进去


在settings.py的INSTALLED_APPS中添加’rest_framework’。

需要手动将rest_framework 添加到INSTALLED_APPS 中,这个一定要手动添加,不然用不了drf功能

接下来就可以使用DRF提供的功能进行api接口开发了。在项目中如果使用rest_framework框架实现API接口,主要有以下三个步骤:


  • 将请求的数据(如JSON格式)转换为模型类对象
  • 操作数据库
  • 将模型类对象转换为响应的数据(如JSON格式)


创建模型操作类

class Student(models.Model):
    # 模型字段
    name = models.CharField(max_length=100,verbose_name="姓名",help_text='提示文本:不能为空')
    sex = models.BooleanField(default=1,verbose_name="性别")
    age = models.IntegerField(verbose_name="年龄")
    class_null = models.CharField(max_length=5,verbose_name="班级编号")
    description = models.TextField(max_length=1000,verbose_name="个性签名")

    #通过django migrate默认创建的表名是 应用名_类名小写,如果不想用默认的,可以自己配置表的元信息
    #通过class Meta类来配置
    class Meta:
        #配置表名
        db_table="tb_student"
        #这里是为了配置Django的后台管理系统admin里面的表名
        verbose_name = "学生"
        #这里是为了配置让表名不以复数形式显示,默认是以复数形式显示
        verbose_name_plural = verbose_name


我们看urls.py有个admin路径

当我们运行项目时,Django默认带个后台管理系统,需要先执行数据库同步指令

运行项目,登录后台管理系统


需要用户名,密码,初次登录需要我们创建超级管理员用户

控制台 python manager.py createsuperuser

按照提示输入,邮箱可以不用输入


输入用户名,密码登录

这里面有两张系统自带的表,生产中一般不用admin,由于admin功能太过简单,不符合生产要求

如果想用一个不错的后台管理系统,可以用xadmin

admin和xadmin是用来对数据库中的表进行管理的,项目中可能会写很多表。admin和xadmin就可以展示所有的表,以及表中数据

比如我们希望通过admin来管理模型类中的表

创建完,需要我们将models类里面的表注册到admin里面管理


在我们创建的应用下有个admin.py,专门用于admin后台管理系统的

注册模型类

#首先导包
from app01 import models
admin.site.register(models.Student)

重新运行项目,登录管理系统平台,可以看到我们app01应用下自己创建的表

class Meta:下面的verbose_name 就是配置在这里显示的表名

verbose_name_plural 是配置表名复数显示

比如我们注释后再看

表名 显示为我们创建的模型类 类名的复数形式

只配置verbose_name

表名默认以复数形式显示

配置好后,我们进入表中查看

我们可以直接通过这个后台管理系统管理我们的表,做增删改查

点击ADD学生,可以直接添加学生

页面字段显示中文,就是我们创建模型类时,每个字段指定了verbose_name 才能显示的

admin后台管理系统显示字段名称直接是通过verbose_name配置的名称来显示的

还有提示信息help_text 这些主要是给后台管理系统用的


整个admin后台管理系统是基于 form 和model-form开发的。数据检验用的

布尔值,在后台管理系统显示就是个单选框

添加表记录

点保存


默认展示的是模型类对象,怎么展示出表的字段名称呢,在admin.py中配置

现在看表中数据展示

想要修改字段,点击前面的id进入编辑界面



admin就是用来管理数据库表的

也可以查找

也可以直接在展示页面编辑,不能把id放进去

可以做批量修改


创建管理员以后,访问admin站点,先修改站点的语言配置,设置成显示中文 修改settings.py

LANGUAGE_CODE = ‘zh-hans’

重启服务,这样页面就是中文展示


这个admin功能不够全面,后面生产中我们使用xadmin,提供的功能更多

现在我们连接mysql数据库来进行drf操作

create database students;


在项目的__init__.py文件中配置pymysql使用mysql数据库,并兼容高版本mysql


此时,要把原先创建在sqlite3里面的数据迁移到mysql,由于初始化数据库同步语句已经生成了,数据库表没有变化,不要再执行makemigrations

只需要执行migrate

可能的报错处理

数据库中查看表


创建序列化器

创建个子应用 student

startapp student

记得将新创建的应用添加到INSTALLED_APPS里面

配置路由分发,在新创建的应用下创建urls.py文件

项目下的urls.py 将各个应用的url导入

在student应用目录中新建serializers.py用于保存该应用的序列化器。


创建一个StudentModelSerializer类用于序列化与反序列化。

#创建序列化器类,回头会在视图中被调用

#要继承rest_framework中的一个类ModelSerializer

from rest_framework.serializers import ModelSerializer
from app01 import models
class StudentModelSerializer(ModelSerializer):
    #配置元信息
    class Meta:
        model = models.Student
        fields = "__all__"
model 指明该序列化器处理的数据字段从模型类Student参考生成
fields 指明该序列化器包含模型类中的哪些字段,'__all__'指明包含所有字段

可以使用fields来明确字段,__all__表示包含所以字段,具体那些字段->fields = ('title','price')

由于之前admin管理后台创建的超级用户存在了sqlite3,现在数据库换成了mysql,需要重新创建一个,存在了django内置的auth-user表中

登录上去,添加些数据


视图类函数

from django.shortcuts import render

# Create your views here.

from app01 import models

from django.http import JsonResponse
#引入我们创建的序列化器类
from student.serializers import StudentModelSerializer
def students(request):
    method = request.method
    if method == 'GET':
        studentdata = models.Student.objects.filter()
        #序列化多条数据,需要加上many=True,返回序列化对象
        serializer_obj = StudentModelSerializer(instance=studentdata,many=True)
        #返回列表类型数据
        print(serializer_obj.data,type(serializer_obj.data))
        #JsonResponse返回非字典类型数据,需要加上safe=False,返回中文,需要加上, json_dumps_params={'ensure_ascii': False}  不然浏览器查看是Unicode码
        return JsonResponse(serializer_obj.data,safe=False, json_dumps_params={'ensure_ascii': False})

查看数据类型,每个字典由一个元祖包裹

浏览器访问,达到效果,前端拿到数据之后,方便循环来展示

DRF可以用一个方法实现5个接口,增删改查,我们视图使用CBV模式

视图类

from app01 import models

from django.http import JsonResponse
#引入我们创建的序列化器类
from student.serializers import StudentModelSerializer

#导入DRF的ModelViewSet类
from rest_framework.viewsets import ModelViewSet

#定义的视图类要继承ModelViewSet类
class StudentView(ModelViewSet):
    #queryset 指明该视图集在查询数据时使用的查询集
    #serializer_class  指明该视图在进行序列化或反序列化时使用的序列化器
    queryset = models.Student.objects.all()
    serializer_class = StudentModelSerializer

路由也由drf来注册生成

from student import views

#Django2之后的path不支持正则,正则使用re_path

urlpatterns = [
    # path('students/', views.students),
]

#使用rest_frame创建路由,首先导包
from rest_framework.routers import DefaultRouter
url_obj = DefaultRouter()    # 可以处理视图的路由器,自动通过视图来生成增删改查的url路径
url_obj.register('students',views.StudentView)     #students是生成的url前缀,名称随便写, 向路由器中注册视图集
urlpatterns += url_obj.urls   # 将路由器中的所有路由信息追到到django的路由列表中

浏览器访问查看,这些路由都是drf的defaultrouter对象自动生成的

DefaultRouter生成的接口路径太死板,在公司中我们也基本不用它,都是自己手写的

我们查看下students返回的json,页面视图都是drf提供的

视图页面是由ModelViewSet这个视图类提供的

正常的APIView或者View 页面都是返回的json字符串



如果我们不想看页面,也可以只看json数据,在url添加?format=json

这些都是DRF提供的功能

不仅提供了查看数据,也可以直接添加数据,可以直接在页面添加数据

不仅可以以form表单形式提交,还可以以原生json格式提交



输入数据,点POST直接添加到数据库

也可以查询指定id的数据

在浏览器中输入网址127.0.0.1:8000/stu/students/3/,可以访问获取单一学生信息的接口(id为3的学生),呈现如下页面:



可以直接修改数据,然后点击put提交

点击put后,返回修改后的数据

点击delete,可以删除本条记录

删除成功返回状态码204




序列化器类中,可以使用fields来明确字段,__all__表示包含所以字段,具体那些字段->fields = (‘title’,‘price’)

也可以序列化指定字段数据

访问接口查看



Django的web框架Django Rest_Framework精讲(二)https://developer.aliyun.com/article/1496740

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
开发框架 JavaScript 前端开发
如何选择合适的Web开发框架?
【9月更文挑战第1天】如何选择合适的Web开发框架?
42 1
|
12天前
|
Web App开发 前端开发 JavaScript
Web前端项目的跨平台桌面客户端打包方案之——CEF框架
Chromium Embedded Framework (CEF) 是一个基于 Google Chromium 项目的开源 Web 浏览器控件,旨在为第三方应用提供嵌入式浏览器支持。CEF 隔离了底层 Chromium 和 Blink 的复杂性,提供了稳定的产品级 API。它支持 Windows、Linux 和 Mac 平台,不仅限于 C/C++ 接口,还支持多种语言。CEF 功能强大,性能优异,广泛应用于桌面端开发,如 QQ、微信、网易云音乐等。CEF 开源且采用 BSD 授权,商业友好,装机量已超 1 亿。此外,GitHub 项目 CefDetector 可帮助检测电脑中使用 CEF
62 3
|
19天前
|
API 开发者 Python
"FastAPI路由大揭秘!轻松玩转URL映射,让你的Web应用路由设计既RESTful又灵活多变,秒杀传统框架的秘籍在这里!"
【8月更文挑战第31天】在Web开发中,路由是连接用户请求与后端逻辑的关键。FastAPI作为现代Python Web框架的佼佼者,以其简洁的API设计和高性能,提供了高度灵活的路由系统。本文通过开发一个博客系统的案例,详细介绍了FastAPI中路由的实现方法,包括基础路由定义、参数类型验证及路由分组与嵌套等,展示了如何轻松构建RESTful风格的URL映射,提升应用的可维护性和扩展性。
32 2
|
5天前
|
数据处理 Python
Django视图:构建动态Web页面的核心技术
Django视图:构建动态Web页面的核心技术
|
19天前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
29 0
|
19天前
|
数据库 开发者 Java
Hibernate映射注解的魔力:实体类配置的革命,让你的代码量瞬间蒸发!
【8月更文挑战第31天】Hibernate 是一款出色的对象关系映射框架,简化了 Java 应用与数据库的交互。其映射注解让实体类配置变得直观简洁。本文深入剖析核心概念与使用技巧,通过示例展示如何简化配置。
23 0
|
19天前
|
数据库 开发者 Java
数据战争:Hibernate的乐观与悲观锁之争,谁将主宰并发控制的王座?
【8月更文挑战第31天】在软件开发中,数据一致性至关重要,尤其是在多用户并发访问环境下。Hibernate 作为 Java 社区常用的 ORM 框架,提供了乐观锁和悲观锁机制来处理并发问题。乐观锁假设数据不易冲突,通过版本号字段 (`@Version`) 实现;悲观锁则假定数据易冲突,在读取时即加锁。选择哪种锁取决于具体场景:乐观锁适合读多写少的情况,减少锁开销;悲观锁适合写操作频繁的场景,避免数据冲突。正确应用这些机制可提升应用程序的健壮性和效率。
26 0
|
19天前
|
Java Maven Android开发
解锁Web开发新技能:从零开始的Struts 2之旅——让你的Java编程之路更加宽广,首个应用实例带你飞!
【8月更文挑战第31天】对于初学者,掌握 Struts 2 框架不仅能提升 Web 开发能力,还能深入了解 MVC 架构。Struts 2 是一个基于 Servlet 的 Java 框架,提供表单验证、文件上传、国际化等功能,便于快速构建易维护的 Web 应用。本文通过示例演示如何从零开始搭建环境并创建一个简单的 Struts 2 项目,包括配置 `struts.xml`、编写 Action 类及视图文件,并配置 web.xml。通过这些步骤,你将学会基本的开发流程,为进一步学习高级功能打下基础。
29 0
|
19天前
|
Java 开发者 数据安全/隐私保护
Struts 2 拦截器机制震撼登场!紧跟技术热点,解锁高效开发密码,引发开发者情感共鸣
【8月更文挑战第31天】在 Java Web 开发中,Struts 2 框架凭借其强大功能和灵活性深受开发者喜爱。其中,拦截器机制是 Struts 2 的重要特性之一,它允许我们在请求处理过程中执行自定义操作,如日志记录、权限验证和数据转换等。拦截器通过实现 `com.opensymphony.xwork2.interceptor.Interceptor` 接口并在 `struts.xml` 中配置即可使用。合理利用拦截器可实现代码解耦与复用,提升开发效率和系统可维护性。框架还提供了如 `params` 和 `servletConfig` 等内置拦截器供开发者按需选用。
28 0
|
19天前
|
开发者 Java UED
大文件传输不再头疼:揭秘Struts 2如何轻松应对文件上传与下载难题!
【8月更文挑战第31天】在Web应用开发中,文件上传与下载至关重要。Struts 2作为主流Java EE框架,凭借Commons FileUpload及文件上传拦截器简化了相关操作。本文探讨Struts 2在文件传输上的优势,通过具体配置与代码示例,展示如何设置最大文件大小、使用`fileUpload`拦截器以及实现文件上传与下载功能。对于大文件传输,Struts 2不仅能够轻松应对,还支持上传进度显示,有效提升了用户体验。总体而言,Struts 2为文件传输提供了高效便捷的解决方案,助力开发者构建稳定可靠的Web应用。然而,在处理大文件时需兼顾网络带宽与服务器性能,确保传输顺畅。
38 0