DRF框架入门介绍

引入

1.什么是 RESTful

  • REST与技术无关,它是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移

  • REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态

  • 所有的数据,不管是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性

  • 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)

一.Web应用两种开发模式

1.前后端不分离模式

  • 也叫前后端混合开发模式, 需要后端写模板语言(dtl), 返回的是HTML页面
  • 浏览器 : 请求动态页面
  • 后端 : 返回HTML

image-20210412152509683

  • 优点

可以直接渲染页面, 方便处理请求数据

  • 缺点

耦合度非常高, 不方便扩展

2.前后端分离模式

  • 前端 : 只写前端

  • 后端 : 只专注于写后端接口, 返回 json, xml格式数据

  • 流程 :

浏览器到静态文件服务器请求静态页面, 静态服务器返回静态页面

JS 请求达到后端, 后端再返回 JSON 或 XML格式的数据

image-20210412154658859

  • 优点
  • 不需要管前端怎么实现, 后端开发者需要做的就是写接口

  • 只需要知道, 你前端传过来什么, 然后需要后端这边传回去什么就行了

  • 主要的就是操作逻辑, 解耦合性高

  • 缺点
  • 程序员不知道前端的具体流程, 然后对表的设计, 对业务或许就理解的没有那么透彻

  • 还存在前后端联调各种问题, 前端和后端的沟通等

二.API 接口和 RESTful API规范

1.API 接口

  • 规定了前后端信息交互规则的 url 连接, 也就是前后端交互的媒介

2.为什么使用这个规范

  • 为了在团队内部形成共识、防止个人习惯差异引起的混乱
  • 我们需要找到一种大家都觉得很好的接口实现规范, 用途一目了然,减少双方之间的合作成本

3.接口文档

  • 书写接口的用途和使用方法,数据格式等
  • 可以手动书写, 或者使用工具自动生成(coreapi,swagger)

4.RESTful API规范

一共有十条, 规定这么做, 但公司可以根据自己的需求改变

  • **1.**数据的安全保障, 通常使用 https 进行传输
# http协议 + ssl证书
# 使用https协议进行传输可以提高数据交互过程中的安全性
# 就算传输过程中被截获也需要 公钥-私钥 匹配才能得到数据
  • **2.**接口特征表现 : 域名中有 api 标识
# 尽量将API部署在专用域名,看到api字眼,就代表该请求url链接是完成前后台数据交互的
    https://api.example.com 
    https://127.0.0.0:8080/api/ 
  • **3.**多版本 : 请求地址中带版本, 或者在请求头中
# v1,v2 代表不同版本
    https://127.0.0.0:8080/api/v1/
    https://127.0.0.0:8080/api/v2/
  • **4.**数据即资源, 均使用名词表示 (可以复数尽量不要用动词)
# 使用名词,可以使用复数
	https://api.example.com/v1/books/

# 不符合规范
	https://api.example.com/v1/get_all_books
  • **5.**通过请求方式的不同来执行不同的操作
get : 获取数据
post : 新增数据
put : 全部更新
patch : 局部更新 (基本上都使用put)
delete : 删除

# 示例 : 
    https://api.baidu.com/books   - get请求:   获取所有书
    https://api.baidu.com/books/1 - get请求:   获取主键为1的书
    https://api.baidu.com/books   - post请求:  新增一本书
    https://api.baidu.com/books/1 - put请求:   整体修改主键为1的书
    https://api.baidu.com/books/1 - patch请求: 局部修改主键为1的书
    https://api.baidu.com/books/1 - delete请求:删除主键为1的书
  • **6.**请求路径中带过滤, 在 url 后面带参数
https://api.example.com/v1/?name='金'&order=asc
https://api.example.com/v1/name?sortby=name&order=asc
  • **7.**返回数据中携带响应状态码
# 返回的json格式中放状态码, 标志当前请求成功或失败
    2XX : 正常响应
    3XX : 重定向响应
    4XX : 客户端异常
    5XX : 服务端异常
  • **8.**返回数据中携带错误信息
# 错误处理, error当做key, 错误信息当做value
	{error : '错误信息'}
  • **9.**针对不同操作, 返回数据符合如下规范(这只是规范)
GET /books:     返回资源对象的列表      (数组)[{},{},{}]
GET /books/1:   返回单个资源对象         {}
POST /books:    返回新生成的资源对象     {新增的书}
PUT /books/1:   返回完整的资源对象       {返回修改后的}
PATCH /books/1: 返回完整的资源对象       {返回修改后的}
DELETE /books/1:返回一个空文档   
  • **10.**返回结果中携带资源连接
{
    "name":"xxx博客",
    "url":"https://www.cnblogs.com/songhaixing/"
}

三.接口测试工具 : Postman 与 Appizza

1.工具地址

ps : 接口测试工具不止这两种, 有很多:Postwoman …

2.Postman常用功能介绍

  • get请求:

image-20210412164043895

  • post请求:

image-20210412164346004

  • 导出请求结果, 导到一个文件里面

image-20210412164459622

  • 导入请求文件

image-20210412164620897

3.Apizza 界面

  • 中文显示, 功能上与Postman使用没有很大的差别

image-20210412164935894

四.Django-RESTful 介绍与安装

1.介绍

  • Django rest_framework, 简称 drf, 可以更方便的使用django写出符合 RESTful 规范的接口, (缩减编写api接口的代码)
  • Django REST framework是一个建立在Django基础之上的Web应用开发框架(Django的一个app),可以快速的开发REST API接口应用
  • 在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程
  • 不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作
  • REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持
  • REST framework提供了一个API 的Web可视化界面来方便查看测试接口

2.安装与快速使用(csrf禁用状态)

  • 安装 drf
pip3 install djangorestframework
  • settings.py 文件中添加app
INSTALLED_APPS = [
    'rest_framework'
]
  • models.py 文件书写模型类
from django.db import models


class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    author = models.CharField(max_length=16)
    publish = models.CharField(max_length=16)
# 创建好模型类执行数据库迁移命令
  • serializers.py 新建一个序列化类(该文件自己创建)
from rest_framework.serializers import ModelSerializer
from drf_test import models


class BookSerializers(ModelSerializer):
    class Meta:
        model = models.Book  #  指明该序列化器处理的数据字段从模型类Book参考生成
        fields = "__all__"   # 指明该序列化器包含模型类中的哪些字段,’all‘指明包含所有字段
  • views.py 书写视图类
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from drf_test.serializers import BookSerializers
from drf_test import models


class BookView(ModelViewSet):
    serializer_class = BookSerializers  # 指明该视图在进行序列化或反序列化时使用的序列化器
    queryset = models.Book.objects.all()  # 指明该视图集在查询数据时使用的查询集
  • urls.py 书写路由关系
from django.contrib import admin
from django.urls import path
from rest_framework.routers import SimpleRouter
from drf_test import views


router = SimpleRouter()  # 用来处理视图的路由器
router.register('book',views.BookView)  # 在路由器中注册视图集
urlpatterns = [
    path('admin/', admin.site.urls),
    	
]
urlpatterns += router.urls  # 将路由器中的所有路由信息拼接到Django中的路由列表中
  • 启动项目开始测试

    期间遇到的一个问题 : OrderedDict‘ object has no attribute ‘register‘报错信息

    • 原因是markdown的版本不兼容导致的问题,可以将markdown的版本安装到3.2.1,问题即得到解决
    pip3 install markdown==3.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
    

image-20210412182703786

  • POST : 添加一本书籍信息

asdafdsc

  • GET : 获取图书 (nid=2的书籍)

ghg

可以点击下面的输入框进行修改

  • 点击 DELETE 删除书籍 (nid=2)

xscd


版权声明:本文为songhaixing2原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。