首页 > 其他分享 >【2022-09-23】DRF入门到入土(一)

【2022-09-23】DRF入门到入土(一)

时间:2022-09-23 19:56:26浏览次数:112  
标签:API https 请求 23 09 接口 api 2022 序列化

drf入门规范

一、web应用模式

  • web应用模式分为两种,一种是前后端不分离,一种是前后端分离

  • 前后端不分离

    前后端不分离

  • 前后端分离

    前后端分离

二、API接口

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

  • API接口:通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介

  • web API接口的四大特点:

    url:长得像返回数据的url链接

    请求方式:get、post、put、patch、delete

    请求参数:json或xml格式的key-value类型数据

    响应结果:json或xml格式的数据

    # xml格式
    https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295&region=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=xml
    #json格式
    https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295&region=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json
    {
        "status":0,
      	"message":"ok",
        "results":[
            {
                "name":"肯德基(罗餐厅)",
                "location":{
                    "lat":31.415354,
                    "lng":121.357339
                },
                "address":"月罗路2380号",
                "province":"上海市",
                "city":"上海市",
                "area":"宝山区",
                "street_id":"339ed41ae1d6dc320a5cb37c",
                "telephone":"(021)56761006",
                "detail":1,
                "uid":"339ed41ae1d6dc320a5cb37c"
            }
          	...
    		]
    }
    

三、接口测试工具postman

  • Postman是一款接口调试工具,是一款免费的可视化软件,同时支持各种操作系统平台,是测试接口的首选工具。

  • Postman可以直接从官网:https://www.getpostman.com/downloads/下载获得,然后进行傻瓜式安装。

  • 工具首页

  • 发送get请求

  • 发送post请求

四、RESTful API规范

REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征性状态转移)。 它首次出现在2000年Roy Fielding的博士论文中。

RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中。

这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。

事实上,我们可以使用任何一个框架都可以实现符合restful规范的API接口。

4.1 数据的安全保障

​ url链接一般都采用https协议进行传输

​ 采用https协议,可以提高数据交互过程中的安全性

4.2 接口api关键字标识

​ 用api关键字标识接口url:

https://api.www.baidu.com

https://www.baidu.com/api

​ 看到api字眼,就代表该请求url链接是完成前后台数据交互的

4.3 多数据版本共存

​ 在url链接中标识数据版本

https://api.baidu.com/v1

https://api.baidu.com/v2

​ url链接中的v1、v2就是不同数据版本的体现(只有在一种数据资源有多版本情况下)

4.4 数据即资源,均使用名词

​ 接口一般都是完成前后台数据的交互,交互的数据我们称之为资源

https://api.www.baidu.com/users

https://api.www.baidu.com/books

​ 一般提倡用资源的复数形式,在url链接中奖励不要出现操作资源的动词,错误示范:https://api.baidu.com/delete-user

​ 特殊的接口可以出现动词,因为这些接口一般没有一个明确的资源,或是动词就是接口的核心含义

https://api.baidu.com/login

4.5 资源操作由请求方式决定

​ 操作资源一般都会涉及到增删改查,我们提供请求方式来标识增删改查动作

​ 获取数据>>>>>>get请求

​ 删除数据>>>>>>delete请求

​ 修改数据>>>>>>put/patch请求

​ 新增数据>>>>>>post请求

4.6 url地址中带过滤条件

​ 获取动物园所有动物 127.0.0.1/api/v1/animals --->get请求

​ 获取动物园所有哺乳类动物 127.0.0.1/api/v1/animals?type=哺乳类 --->get请求

4.7 响应状态码
4.7.1 正常响应

​ 响应状态码2xx

​ 200:普通请求

​ 201:创建成功

4.7.2 重定向响应

​ 响应状态码3xx

​ 301:永久重定向

​ 302:临时重定向

4.7.3 客户端异常

​ 响应状态码4xx

​ 403:请求无权限

​ 404:请求路径不存在

​ 405:请求方法不存在

4.7.4 服务端异常

​ 响应状态码5xx

​ 500:服务器异常

4.8 返回错误信息
{
    error: "无权限操作"
}
4.9 返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
ET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档
4.10 需要url请求的资源需要访问资源的请求链接
# Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么
{
  	"status": 0,
  	"msg": "ok",
  	"results":[
        {
            "name":"肯德基(罗餐厅)",
            "img": "https://image.baidu.com/kfc/001.png"
        }
      	...
		]
}

五、序列化与反序列化

api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式,序列化可以分两个阶段:

序列化: 把我们识别的数据转换成指定的格式提供给别人。

例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。

反序列化:把别人提供的数据转换/还原成我们需要的格式。

例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。

六、DRF快速使用

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

DRF特点
  • 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
  • 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
  • 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
  • 多种身份认证和权限认证方式的支持;[jwt]
  • 内置了限流系统;
  • 直观的 API web 界面;
  • 可扩展性,插件丰富
DRF安装配置
  • 安装drf插件
pip3 install djangorestframework
  • 创建模型操作类
from django.db import models


class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)
    publish = models.CharField(max_length=32)
  • 创建数据库
create database book
  • settings文件配置
DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # },
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "book",
        "HOST": "127.0.0.1",
        "PORT": 3306,
        "USER": "root",
        "PASSWORD":"123",
    },
}
  • 执行数据迁移
python manage.py makemigrations
python manage.py migrate
  • urls.py
from django.contrib import admin
from django.urls import path
from rest_framework.routers import SimpleRouter
from app01 import views

router = SimpleRouter()
router.register('books', views.BookView)
urlpatterns = [
    path('admin/', admin.site.urls),
]
urlpatterns += router.urls
  • views.py
from .models import Book
from rest_framework.viewsets import ModelViewSet
from .serializer import BookSerializer


class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
  • serializer.py
from rest_framework import serializers
from .models import Book


class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
Postman接口测试

获取所有请求

获取单个请求

删除一个请求

修改一个请求

新增一个请求

七、CBV源码分析

# 以后都写cbv,都写基于类的试图

# cbv写好后,路由配置如下
	-第一个参数是路径,第二个参数是试图函数的内存地址(视图类执行as_view这个类方法,把它执行完,结果放在第二个参数上:我们猜执行完的结果是个函数内存地址)
	path('test/', views.TestView.as_view()),
    
    -去找as_view,去TestView类中找,找不到,没有,去父类中找View
        @classonlymethod
        def as_view(cls, **initkwargs):
            def view(request, *args, **kwargs):
                return self.dispatch(request, *args, **kwargs)
            return view
    -当请求来了,路由匹配成功,会执行view(request)--->本质执行self.dispatch(request, *args, **kwargs)
    -去View中找到了dispatch
        def dispatch(self, request, *args, **kwargs):
            # 请求方式转成小写,假设 get 请求,符合if条件
            if request.method.lower() in self.http_method_names:
                # 反射 getattr(对象,'字符串','默认值')
                # self是TestView的对象
                # handler 就是TestView类的get方法
                handler = getattr(self, 'get', self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed
            return handler(request, *args, **kwargs)  # get(request)

标签:API,https,请求,23,09,接口,api,2022,序列化
From: https://www.cnblogs.com/dy12138/p/16724034.html

相关文章

  • 14th 2022/7/12 模拟赛总结7
    这次总的来说可能还行,rk11,较上次差点,但却是保持住了若是继续保持,将有利于我的雄心再起嗯加油回到比赛,这次先T3,T3轻松推出DP转移方程,然后发现所用的无用状态过多,去世,TL......
  • 15th 2022/7/13 模拟赛总结8
    这次嗯,打得不大好总的来说,是T2正解打挂,然后看见了T3的解决方法却没有深入研究最后T4给了最少的时间然后打完也没有什么事情干,嗯,这种情况可以做出一些改进的方法当然是......
  • 2nd 2022/5/3-2022/5/4 简单数论学习
    Day-1/2:2022/5/3·1最大公约数枚举。。。训算法质因数分解。。。是个办法,但大材小用,浪费了算法得来的其他数据,时间较慢欧几里得算法,辗转相除,巧妙消元,时间$O(\l......
  • 3rd 2022/5/9 题目总结·数论篇·欧拉函数·【SDOI2008】仪仗队
    原题作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N*N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的生后方,根据其视线所及的学生人数......
  • 4th 2022/5/25 算法总结 哈希篇
    开头的话这个算法,并不像大部分其它的算法那样,逻辑正确后,时间复杂度一般都是较稳定的,哪怕是最高和最低之间也没差多少但哈希不一样,它时间复杂度较不稳定,虽然可以通过特殊......
  • CSP202109_2
    CSP202109_2目录CSP202109_2题目思路暴力差分优化Code题目非零段划分思路暴力直接暴力,依次枚举所有可能的p,针对当前p遍历序列求非零段个数。时间复杂度\(O(n^2)\)......
  • 9.23 DAY 02
    读论文:2020_ECCV_Object-ContextualRepresentationsforsemanticsegmentation首先,在gt指导下分割学习目标区域(粗分割);其次,通过聚合位于目标区域内像素的表示来计算目标......
  • 【2022-09-21】辛苦20年
    20:00这个岁月,你不跟它相处,它也要过,它就不由你分说,一秒一秒地都走掉了。所以你必须跟时间相处好。                      ......
  • 【2022-09-20】连岳摘抄
    23:59我们可以否认一样东西,但不一定非得诋毁它,或者剥夺别人相信的权利。                              ......
  • 【线性dp】 [SCOI2009]粉刷匠
    点个关注点个赞吧一道比较简单的线性dp题目前置知识:会手推一些简单的状态转移方程、较为熟练地掌握背包问题模型[SCOI2009]粉刷匠题目描述windy有\(N\)条木......