一 WEB应用模式

在开发Web应用中,有两种应用模式:

1.1  前后端不分离

1.2 前后端分离

二  API接口

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

目前市面上大部分公司开发人员使用的接口服务架构主要有:restful、rpc。

2.1 rpc

rpc: 翻译成中文:远程过程调用[远程服务调用].

  post请求

  action=get_all_student&params=301&sex=1

  接口多了,对应函数名和参数就多了,前端在请求api接口时,就会比较难找.容易出现重复的接口

2.2  restful

restful: 翻译成中文: 资源状态转换.

把后端所有的数据/文件都看成资源.那么接口请求数据,本质上来说就是对资源的操作了.

web项目中操作资源,无非就是增删查改.所以要求在地址栏中声明要操作的资源是什么,然后通过http请求动词来说明对资源进行哪一种操作.

2.3 RESTful API规范

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

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

这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。而对于数据资源分别使用POST、DELETE、GET、UPDATE等请求动作来表达对数据的增删查改。

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

2.4 序列化

api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式。

序列化可以分两个阶段:

1 序列化

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

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

2 反序列化

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

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

2.4 Django Rest_Framework

核心思想: 缩减编写api接口的代码

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

特点:

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

三 API借口初步尝试

3.1 环境安装与配置

在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题;亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难。此时,我们需要对于不同的工程使用不同的虚拟环境来保持开发环境以及宿主环境的清洁。

virtualenv是一个可以帮助我们管理不同 Python 环境,可以在系统中建立多个不同并且相互不干扰的虚拟环境。

在虚拟环境安装drf,许碧环境安装参考https://www.cnblogs.com/zyxnhr/p/12686908.html

root@darren-virtual-machine:~# mkdir /root/PycharmProjects/drfdemo/

root@darren-virtual-machine:~# cd /root/PycharmProjects/drfdemo/

root@darren-virtual-machine:~# mkvirtualenv drfdemo -p python3

(drfdemo) root@darren-virtual-machine:~# pip3 install django

(drfdemo) root@darren-virtual-machine:~# pip3 install djangorestframework

(drfdemo) root@darren-virtual-machine:~# pip3 install pymysql

3.2 创建一个django项目

(drfdemo) root@darren-virtual-machine:~/PycharmProjects/drfdemo# pip3 lis

Package             Version
------------------- -------
asgiref 3.2.7
Django 3.0.5
djangorestframework 3.11.0
pip 20.0.2
PyMySQL 0.9.3
pytz 2019.3
setuptools 46.1.3
sqlparse 0.3.1
wheel 0.34.2

(drfdemo) root@darren-virtual-machine:~/PycharmProjects/drfdemo# django-admin startproject drf_demo

(drfdemo) root@darren-virtual-machine:~/PycharmProjects/drfdemo# tree drf_demo

drf_demo/
├── drf_demo
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

使用Pycharm配置虚拟环境解释器

先打开这个项目

选择show all

弹窗+选择添加

根据自己的虚拟化环境,选择需要的解释器

确定之后

点击OK

即使用虚拟环境的python3.6

添加rest framework应用,并创建注册app

(drfdemo) root@darren-virtual-machine:~/PycharmProjects/drfdemo# cd drf_demo/
(drfdemo) root@darren-virtual-machine:~/PycharmProjects/drfdemo/drf_demo# python3 manage.py startapp students

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'students.apps.StudentsConfig'
]

3.3 简单配置

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

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

  • 操作数据库

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

配置模型类

from django.db import models

# Create your models here.
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

数据库操作

创建数据库,注册并执行迁移数据库命令

mysql> create database drf default charset=utf8;

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'drf',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '123456',
}
}

__init__.py

import  pymysql
pymysql.install_as_MySQLdb()

修改注释

(drfdemo) root@darren-virtual-machine:~/PycharmProjects/drfdemo/drf_demo# vim /root/Envs/drfdemo/lib/python3.6/site-packages/django/db/backends/mysql/base.py

#if version < (1, 3, 13):
# raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

(drfdemo) root@darren-virtual-machine:~/PycharmProjects/drfdemo/drf_demo# python3 manage.py makemigrations

(drfdemo) root@darren-virtual-machine:~/PycharmProjects/drfdemo/drf_demo# python3 manage.py migrate

查看数据库

mysql> use drf;

mysql> show tables;

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

(drfdemo) root@darren-virtual-machine:~/PycharmProjects/drfdemo/drf_demo# vim students/serializers.py

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

from rest_framework import serializers
from students.models import Student # 创建序列化器类,回头会在视图中被调用
class StudentModelSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = "__all__"
# fields = ("id", "name") # 也可指定字段
  • model 指明该序列化器处理的数据字段从模型类Student参考生成

  • fields 指明该序列化器包含模型类中的哪些字段,'all'指明包含所有字段

编辑视图类

from django.shortcuts import render

# Create your views here.
from rest_framework.viewsets import ModelViewSet
from students.models import Student
from students.serializers import StudentModelSerializer class StuentAPIView(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
  • queryset 指明该视图集在查询数据时使用的查询集

  • serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器

定义路由

(drfdemo) root@darren-virtual-machine:~/PycharmProjects/drfdemo/drf_demo# vim students/urls.py

from rest_framework.routers import DefaultRouter
from students import views
urlpatterns = [] # 路由列表
router = DefaultRouter() # 可以处理视图的路由器
router.register('student', views.StuentAPIView) # url进行注册
urlpatterns += router.urls # 将路由器中的所有路由信息追加到django的路由列表中

配置路由分发

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

3.4 运行测试

启动访问http://127.0.0.1:8000/student/student/

POST提交

数据库查看

mysql> select * from tb_student;

json格式数据提交

POST提交

mysql> select * from tb_student;

在开始刷新,导致多插入了数据

使用请求修改pk=2和pk=3的数据

访问http://127.0.0.1:8000/student/student/2/

PUT提交,查看数据库

mysql> select * from tb_student;

同样修改pk=3

访问http://127.0.0.1:8000/student/student/3/

PUT调教查看数据库

删除

访问http://127.0.0.1:8000/student/student/4/

点击删除并确定,查看数据库

后不跟pk值,就是获取所有

访问http://127.0.0.1:8000/student/student/

使用postman调试,得到get数据

使用POST提交数据

点击send发送.检查数据

同样也可以get put等请求操作数据

参考:https://www.cnblogs.com/Michael--chen/p/11222143.html

065.Python框架Django-DRF的更多相关文章

  1. python框架Django简介与安装

    Django简介 关注公众号"轻松学编程"了解更多. 发布于2005年,最负盛名且成熟的Python网络框架 最初用来制作在线新闻的Web站点 开源Web框架,遵守BSD协议 BS ...

  2. 067.Python框架Django之DRF视图类

    一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...

  3. 068.Python框架Django之DRF视图集使用

    一 视图集与路由的使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...

  4. 编程 - Python - 框架 - Django

    一.Django简介 百度百科:一个开放源代码的Web框架,由Python语言编写...... 重点:一个大而全的框架,啥都替你考虑好了. 1. web框架介绍 具体介绍Django之前,必须先介绍W ...

  5. python框架-Django安装使用

    1.安装pip sudo apt-get install python-pip 遇到问题需要更新下语言包 sudo apt-get update 检查pip是否安装成功 pip -V 查看已安装包 p ...

  6. python框架Django中MTV框架之VIew(业务控制器)

    MTV框架之VIew(业务控制器) 关注公众号"轻松学编程"了解更多. 1.什么是视图 视图层=路由表(urls.py)+视图函数(views.py) 其角色相当于MVC中的Con ...

  7. python框架Django中MTV框架之Template(模板/界面)

    MTV框架之Template(模板/界面) 关注公众号"轻松学编程"了解更多. 1.模板目录位置 应用下 不需要注册 无法跨应用地进行复用 工程下 需要注册 settings.py ...

  8. python框架Django中MTV之Model(数据模型)

    MTV框架之Model(数据模型) 关注公众号"轻松学编程"了解更多. 1.连接MySQL数据库 项目中的settings.py设置范例 # 配置数据库 DATABASES = { ...

  9. python框架Django中的MTV架构

    MTV架构 关注公众号"轻松学编程"了解更多. ​ 通过V对M和T进行连接,用户通过T(界面)对服务器进行访问(发送请求),T把请求传给V(调度),V调用M(数据模型)获取数据,把 ...

随机推荐

  1. MySQL-一条sql语句的执行顺序

    手写: SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_tab ...

  2. java面试-G1垃圾收集器

    一.以前收集器的特点 年轻代和老年代是各自独立且连续的内存块 年轻代收集器使用 eden + S0 + S1 进行复制算法 老年代收集必须扫描整个老年代区域 都是以尽可能的少而快速地执行 GC 为设计 ...

  3. leetcode 刷题(数组篇)1题 两数之和(哈希表)

    题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元 ...

  4. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像上传-11

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像上传-11 欢迎加QQ群:1026880196 进行交流学习 镜像上传 #controller1 ...

  5. JavaScript设计模式(一):单例模式

    单例模式的定义与特点 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式.例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗 ...

  6. Ionic5手写签名SignaturePad

    测试程序下载:https://hanzhe.lanzous.com/itt47kncw3a 初始化项目 1. 首先新建一个Ionic5的项目: ionic start test-1 blank 2. ...

  7. Web安全实践

    目录 前言 编码安全 反序列化命令执行 SQL 注入 跨站 XSS(Cross-site scripting) 跨站请求伪造 CSRF(Cross-site request forgery) URL跳 ...

  8. POJ1151基本的扫描线求面积

    题意:      给定n个矩形的对角坐标,分别是左下和右上,浮点型,求矩形覆盖的面积. 思路:       基本的线段树扫描线求面积,没有坑点,不解释了,提示一点,有的题尤其是线段树扫描线的题需要离散 ...

  9. Python脚本破解图形验证码(tesserocr和pytesseract)

    在学习之前,我们先了解OCR.tesseract.tesserocr.pytesseract和opencv这几个跟图片处理有关的库. OCR(Optical Character Recognition ...

  10. WindowsPE 第五章 导出表

    导出表 PE中的导出表存在于动态链接库文件里.导出表的主要作用是将PE中存在的函数导出到外部,以便其他人可以使用这些函数,实现代码重用. 5.1导出表的作用 代码重用机制提供了重用代码的动态链接库,它 ...