01-- python/ Django-rest-framework框架/1-drf-drf入门规范

1,web 开发模式

1.1前后端混合开发模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y5eFeqpK-1631280706253)(C:/Users/DELL/AppData/Roaming/Typora/typora-user-images/image-20210830151302970.png)]

1.2前后端分离

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YRH9NK2Q-1631280706256)(C:/Users/DELL/AppData/Roaming/Typora/typora-user-images/image-20210830151318602.png)]

2,API接口

API接口: 前后端信息交互的媒介

类似于这种:https://api.weibo.com/2/statuses/show.json

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

Web API接口和一般的url链接还是有区别的,Web API接口简单概括有下面四大特点

#url: 长得像返回数据的url链接https://api.map.baidu.com/place/v2/search
#请求方式:get,post, put,patch,delete采用get 方式请求上方接口
#请求参数:Jason或者xml格式的可以-value类型数据ak: 6E823f587c95f0148c19993539b99295region:上海query: 肯德基output:json#响应结果:格式json或者xml的数据#上方请求参数的output参数值决定了响应数据的格式#数据
# 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"}...]
}

3,接口测试工具:postman

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

# post请求携带的请求体,编码格式有几种-urlencoded-默认请情况-在请求体中是: name=egon&age=18----》request.POST-formdata-上传文件-既可以传文件,又可以带数据-在请求体中是:数据部分name=egon&age=18    ----》request.POST文件部分---asdfasdfasdfasdf-------文件的二进制         ----》request.FILES-json-json格式直接放在请求体中-在请求体中的格式{"name":"lqz","age":19}---》request.POST取不到值-为什么取不到?-因为作者没有写,作者只写了urlencoded和formdata的编码-json格式需要自己处理

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

  • 案例:请求百度地图接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJBNbnCc-1631280706262)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/image-20210830183237293.png)]

4 , PESTful API 规范

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

4.1数据的安全保障

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

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

4.2 接口特征表现

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

    • https://api.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.baidu.com/users
    • https://api.baidu.com/books
    • https://api.baidu.com/book

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

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

    • https://api.baidu.com/place/search
    • https://api.baidu.com/login

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

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

    • 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的书

4.6 过滤,通过在url上传参的形式传递搜索条件

  • https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
  • https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置
  • https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
  • https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
  • https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件

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当做key

{error: "无权限操作"
}

4.9 返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范

GET /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"}...]
}

比较好的接口返回

# 响应数据要有状态码、状态信息以及数据本身
{"status": 0,"msg": "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"}...]
}

5,序列化

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

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

前端序列化 JSON.stringify() **后端序列化 ** json.dumps()

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

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

前端反序列化 JSON.parse() **后端反序列化 ** json.loads()

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

6,drf介绍和安装

# djangorestframework:drf,它是django的一个第三方app
# 使用它可以快速的写出符合restful规范的接口
# pip3 install djangorestframework
# 最新版本不支持django 1.x ,支持django 2.x
# 以后都用django2.2.2

官方文档:https://www.django-rest-framework.org/

github: https://github.com/encode/django-rest-framework/tree/master

特点

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

11111

6.3 体验drf完全简写代码的过程(了解)

6.3.1. 创建模型操作类

class Student(models.Model):# 模型字段name = models.CharField(max_length=100,verbose_name="姓名")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="个性签名")class Meta:db_table="tb_student"verbose_name = "学生"verbose_name_plural = verbose_name

为了方便测试,所以我们可以先创建一个数据库。

create database students charset=utf8;
6.3.1.1 执行数据迁移

把students子应用添加到INSTALL_APPS中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0U3mKGiH-1631280706264)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggnfes9gj30na07pq50.jpg)]

初始化数据库连接

安装pymysqlpip install pymysql

主引用中__init__.py设置使用pymysql作为数据库驱动

import pymysqlpymysql.install_as_MySQLdb()

settings.py配置文件中设置mysql的账号密码

DATABASES = {    # 'default': {    #     'ENGINE': 'django.db.backends.sqlite3',    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),    # },    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': "students",        "HOST": "127.0.0.1",        "PORT": 3306,        "USER": "root",        "PASSWORD":"123",    },}

终端下,执行数据迁移。

python manage.py makemigrationspython manage.py migrate

错误列表

# 执行数据迁移 python manage.py makemigrations 报错如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rLXHK4Lr-1631280706265)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggnmwcygj30ro08j0xb.jpg)]

解决方案:

注释掉 backends/mysql/base.py中的35和36行代码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GDFoTZvp-1631280706267)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggnrlrh4j30ri040abp.jpg)]

# 执行数据迁移发生以下错误:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLkpMW6A-1631280706268)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggnvurajj30rc07v41a.jpg)]

解决方法:

backends/mysql/operations.py146行里面新增一个行代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hlKFCbji-1631280706270)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggnzzyggj30s704rmz0.jpg)]

6.3.2. 创建序列化器

例如,在django项目中创建学生子应用。

python manage.py startapp students

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

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

# 创建序列化器类,回头会在试图中被调用class StudentModelSerializer(serializers.ModelSerializer):    class Meta:        model = Student        fields = "__all__"
  • model 指明该序列化器处理的数据字段从模型类BookInfo参考生成
  • fields 指明该序列化器包含模型类中的哪些字段,’all‘指明包含所有字段

6.3.3. 编写视图

在students应用的views.py中创建视图StudentViewSet,这是一个视图集合。

from rest_framework.viewsets import ModelViewSetfrom .models import Studentfrom .serializers import StudentModelSerializer# Create your views here.class StudentViewSet(ModelViewSet):    queryset = Student.objects.all()    serializer_class = StudentModelSerializer
  • queryset 指明该视图集在查询数据时使用的查询集
  • serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器

6.3.4. 定义路由

在students应用的urls.py中定义路由信息。

from . import viewsfrom rest_framework.routers import DefaultRouter# 路由列表urlpatterns = []router = DefaultRouter()  # 可以处理视图的路由器router.register('students', views.StudentViewSet)  # 向路由器中注册视图集urlpatterns += router.urls  # 将路由器中的所以路由信息追到到django的路由列表中

最后把students子应用中的路由文件加载到总路由文件中.

from django.contrib import adminfrom django.urls import path,includeurlpatterns = [    path('admin/', admin.site.urls),    path("stu/",include("students.urls")),]

6.3.5. 运行测试

运行当前程序(与运行Django一样)

python manage.py runserver

在浏览器中输入网址127.0.0.1:8000,可以看到DRF提供的API Web浏览页面:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IkWmOj7u-1631280706272)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggo7yztej30zl0c7gmg.jpg)]

1)点击链接127.0.0.1:8000/stu/students 可以访问获取所有数据的接口,呈现如下页面:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqXoqrk5-1631280706275)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggobtfhkj30zf0i20u0.jpg)]

2)在页面底下表单部分填写学生信息,可以访问添加新学生的接口,保存学生信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4riSw9Le-1631280706276)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggog4ptxj30yq0hgt9h.jpg)]

点击POST后,返回如下页面信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTOodAbB-1631280706277)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggojnhflj30z70ekjsd.jpg)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dfkNGiAn-1631280706279)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggooinxwj30z80hdabb.jpg)]

4)在页面底部表单中填写学生信息,可以访问修改学生的接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tnZzBJPn-1631280706280)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggoujf51j30w50awwet.jpg)]

点击PUT,返回如下页面信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7S88Gumh-1631280706281)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggoza9rbj30x20bx752.jpg)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-thnyVbAk-1631280706282)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggp3eceqj30zt08tt9o.jpg)]

返回,如下页面:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hvoNkUFD-1631280706283)(01–%20python%20Django-rest-framework%E6%A1%86%E6%9E%B61-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83.assets/007S8ZIlgy1ggggp74kyuj30ze0al3zd.jpg)]

作业

#1  写一个装饰器,加在视图函数上,无论前端是哪个格式编码,post请求提交的数据,都从request.data中取# 2 定义一个book表,实现5个接口(使用原生django写出来)  127.0.0.1/books   get  获取所有图书   127.0.0.1/books/1  get 获取id为1的图书    127.0.0.1/books   post   新增一本图书    127.0.0.1/books/1  delete 删除id为1的图书    127.0.0.1/books/1  put  修改id为1的图书# 写一个类,用起来跟字典一样,但是要有   对象.getlist  -继承dict    -重写 __getattr__  ,点拦

1-drf-drf入门规范相关推荐

  1. Drf从入门到精通一(API接口、Postman、Restful规范、序列化、快速使用drf、CBV源码分析)

    文章目录 一.前后端开发模式 二.API接口 三.接口测试工具Postman 四.Restful规范 五.序列化反序列化 六.DjangoRestFramework快速使用 七.CBV源码分析 一.前 ...

  2. drf快速入门01---REST规范介绍序列化器的基础使用

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

  3. Drf从入门到精通四(Drf请求与响应、Drf能够解析的请求编码与响应编码、Drf视图、Drf视图基类)

    文章目录 一.Drf请求与响应 1.Request类和Response类 2.Drf能够解析的请求编码与相应编码 二.Drf视图组件 四.Drf视图基类 1.基于APIView写5个接口 2.基于Ge ...

  4. Drf从入门到精通五(2个视图基类、5个视图拓展类、9个视图子类、视图集)

    文章目录 一.2个视图基类 1) 基于AIPView写5个接口 2) 基于GenericAPIView写5个接口 二.5个视图拓展类 1) 基于GenericAPIView+5个视图拓展类写接口 三. ...

  5. SQL——数据库使用规范(入门规范)

    一.基础规范 1.使用InnoDB存储引擎 2.库.表.列字符集使用utf8mb4,utf8mb4兼容utf8且可以存储表情字符. 3.建议所有表.所有列都需要添加注释 4.不在数据库中存储图,文件等 ...

  6. python Django之 DRF(一)框架介绍、源码分析

    文章目录 一.django rest framework 框架的介绍 1.什么是RESTful规范? 2.RESTful API的介绍 二.drf框架源码解读 1.drf框架的使用 2.APIView ...

  7. Drf简介,什么是drf

    Drf简介 在了解Drf之前先了解几个知识点 web开发模式 混合开发 # 前后端混合开发:- 模板的渲染是在后端完成:比如:后端: name = 'gary'前端: var name = {{ na ...

  8. 【django】DRF

    DRF DRF(Django REST framework)框架是建立在Django框架基础之上,本质上它就是Django的一个App,通过DRF能够快速设计符合RESTful规范的接口,并且它还提供 ...

  9. Django和DRF - 邱乘屹的个人技术博客

    Django和DRF DRF的优势 DRF,全称Django Restful Framework,是一个基于Django的Restful接口框架,是主要用来做API接口的,为前端提供数据的接口 DRF ...

最新文章

  1. 【Android 异步操作】手写 Handler ( 循环者 Looper | Looper 初始化 | Looper 遍历消息队列 MessageQueue )
  2. 又见斐波那契~矩阵快速幂入门题
  3. 操作系统的运行机制和体系机构
  4. spring 配置只读事务_只读副本和Spring Data第1部分:配置数据库
  5. 如何在Java中检查对象是否为空?
  6. day44-前端知识之HTML内容
  7. java url headers,Java CloseableHttpResponse.getHeaders方法代码示例
  8. 最新汇总:一些基于深度学习的视觉里程计/SLAM开源代码
  9. CSDN送你互联网大厂面试机会啦!
  10. 实现JNI的另一种方法:使用RegisterNatives方法传递和使用Java自定义类 (转)
  11. 推理集 —— 工作与职业
  12. 多级队列应用题-2016年408习题
  13. 产品配件类目税目分类_终于找到了!“税收分类编码大全”,有这一篇就够了!...
  14. 2021靠谱的IT培训机构排名重磅来袭!
  15. oppo r11s鸿蒙固件,OPPO R11s Plust官方固件rom刷机包_R11sPlust系统升级包
  16. python 爬取中国裁判文书网 + 破解字体 JS 加密
  17. 一、开水白菜(steamed Chinese cabbage in supreme soup)
  18. Waterfall Scrum
  19. IOS APP程序发布IPA以及发布上传到AppStore
  20. 23上教资开始注册!详细报名流程看这一篇就够了!(建议收藏)

热门文章

  1. 什么是i人,mbti中的i型人格是怎么样的
  2. 目标检测中常提到的IoU和mAP究竟是什么?
  3. php手机模板修改,pc和手机模板自动切换
  4. 在java中使用openCV遍历红色,像素遍历(仅限java)
  5. ColumnTransformer()函数
  6. Excel 分组统计不重复项
  7. 硬盘录像机服务器地址谁控制的,海康硬盘录像机通用设置方法
  8. 《疯狂java讲义》学习(44):线程同步
  9. oracle查找相似字段,两表相似字段查询,如何查询
  10. TP5 封装 mongoDB