一 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. [源码解析] 并行分布式任务队列 Celery 之 消费动态流程

    [源码解析] 并行分布式任务队列 Celery 之 消费动态流程 目录 [源码解析] 并行分布式任务队列 Celery 之 消费动态流程 0x00 摘要 0x01 来由 0x02 逻辑 in komb ...

  2. AutoAssign源码分析

    目录 AutoAssign源码分析 一. 简介 二. 论文理论 2.1 联合表示 2.2 正样本权重 2.3 负样本权重 2.4 总的loss 2.5 补充loss 三. 论文代码 四. 总结 五. ...

  3. Nodejs入门(二)

    Nodejs基础api 1.path path模块提供了很多实用的工具函数,用于处理文件与目录的路径,下面是它的api: normalize 方法可以输出规范格式的path字符串 join 方法用于拼 ...

  4. 前端进阶(1)Web前端性能优化

    前端进阶(1)Web前端性能优化 Web前端性能优化, 不仅能够改善站点的用户体验,并且能够节省相当的资源利用.下面将从1)服务器.2)html内容.3)css. 4)javascript. 5)图片 ...

  5. Mysql - 使用入门

    本文是学习 Mysql必知必会 后的笔记 学习之前需要创建一个数据库,然后导入下面两个mysql脚本 create database db1 charset utf8; ############### ...

  6. misdirection靶机work_through

    web打点 nmap扫描 Nmap scan report for 192.168.218.135 Host is up (0.000014s latency). Not shown: 65531 c ...

  7. Android Apk加固的初步实现思路(dex整体加固)

    一.前 言 Android Apk加固的发展已经有一段时间了,相对来说本篇博客要记录的Android加壳的实现思路是4年的东西了,已经被老鸟玩烂了,Android加固的安全厂商也不会采用这么粗犷的方式 ...

  8. UVA11462年龄排序

    题意:       给你200w个人的年龄,年龄的范围是1-100,然后让你从小到大排序输出所有人的年龄,题目还特意强调输入文件限制25MB,题目内存限制2MB. 思路:      比较经典又简单的一 ...

  9. MS06-040漏洞研究(中)【转载】

    课程简介 经过上次的分析,我们已经知道了MS06-040漏洞的本质,那么这次我们就通过编程实现漏洞的利用. 课程介绍 实验环境: 操作机: Windows XP 实验工具: Tools Path ID ...

  10. 深入浅出带你玩转sqlilabs(三)--GET,POST,COOKIE,万能密码注入

    常见提交方式下的注入漏洞 WEB应用在数据传递接受中,针对SQL注入安全漏洞,由于数据大小,格式等原因,脚本在接受传递时会有多种传递方式,传递方式的不同将影响到安全测试的不同 第一点:数据常见提交方式 ...