065.Python框架Django-DRF
一 WEB应用模式
在开发Web应用中,有两种应用模式:
1.1 前后端不分离
1.2 前后端分离
二 API接口
为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本。
目前市面上大部分公司开发人员使用的接口服务架构主要有:restful、rpc。
2.1 rpc
rpc: 翻译成中文:远程过程调用[远程服务调用].
post请求
action=get_all_student¶ms=301&sex=1
接口多了,对应函数名和参数就多了,前端在请求api接口时,就会比较难找.容易出现重复的接口
2.2 restful
restful: 翻译成中文: 资源状态转换.
把后端所有的数据/文件都看成资源.那么接口请求数据,本质上来说就是对资源的操作了.
web项目中操作资源,无非就是增删查改.所以要求在地址栏中声明要操作的资源是什么,然后通过http请求动词来说明对资源进行哪一种操作.
- POST http://www.luffy.com/api/students/ 添加学生数据
- GET http://www.luffy.com/api/students/ 获取所有学生
- DELETE http://www.luffy.com/api/students/<pk> 删除1个学生
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接口的代码
- Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。
- 在REST framework中,提供了序列化器Serializer的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。
- REST framework提供了认证、权限、限流、过滤、分页、接口文档等功能支持。
- REST framework提供了一个API 的Web可视化界面来方便查看测试接口。
特点:
- 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
- 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
- 丰富的定制层级:
- 函数视图、类视图、视图集合到自动生成 API,满足各种需要;
- 多种身份认证和权限认证方式的支持;
- 内置了限流系统;
- 直观的 API web 界面;
- 可扩展性,插件丰富
三 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的更多相关文章
- python框架Django简介与安装
Django简介 关注公众号"轻松学编程"了解更多. 发布于2005年,最负盛名且成熟的Python网络框架 最初用来制作在线新闻的Web站点 开源Web框架,遵守BSD协议 BS ...
- 067.Python框架Django之DRF视图类
一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...
- 068.Python框架Django之DRF视图集使用
一 视图集与路由的使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...
- 编程 - Python - 框架 - Django
一.Django简介 百度百科:一个开放源代码的Web框架,由Python语言编写...... 重点:一个大而全的框架,啥都替你考虑好了. 1. web框架介绍 具体介绍Django之前,必须先介绍W ...
- python框架-Django安装使用
1.安装pip sudo apt-get install python-pip 遇到问题需要更新下语言包 sudo apt-get update 检查pip是否安装成功 pip -V 查看已安装包 p ...
- python框架Django中MTV框架之VIew(业务控制器)
MTV框架之VIew(业务控制器) 关注公众号"轻松学编程"了解更多. 1.什么是视图 视图层=路由表(urls.py)+视图函数(views.py) 其角色相当于MVC中的Con ...
- python框架Django中MTV框架之Template(模板/界面)
MTV框架之Template(模板/界面) 关注公众号"轻松学编程"了解更多. 1.模板目录位置 应用下 不需要注册 无法跨应用地进行复用 工程下 需要注册 settings.py ...
- python框架Django中MTV之Model(数据模型)
MTV框架之Model(数据模型) 关注公众号"轻松学编程"了解更多. 1.连接MySQL数据库 项目中的settings.py设置范例 # 配置数据库 DATABASES = { ...
- python框架Django中的MTV架构
MTV架构 关注公众号"轻松学编程"了解更多. 通过V对M和T进行连接,用户通过T(界面)对服务器进行访问(发送请求),T把请求传给V(调度),V调用M(数据模型)获取数据,把 ...
随机推荐
- python进阶(一)变量与数据类型、python之禅
一.变量: 1.变量组成:由数据.字母与下划线组合 2.不能以数字开头 3.python关键字与函数名不能作为变量名 4.当字符串变量中包含引号时,可使用单引号与双引号进行区分,或转义 print(& ...
- 刨死你系列——手撕ArrayList
不多BB,直接上代码: public class MyArrayList { //创建数组对象 private Object[] elements; //已使用数组长度 private int siz ...
- ASP.Net 管道模型 VS Asp.Net Core 管道 总结
1 管道模型 1 Asp.Net Web Form管道 请求进入Asp.Net工作进程后,由进程创建HttpWorkRequest对象,封装此次请求有关的所有信息,然后进入HttpRuntime类进 ...
- LA3415保守的老师
题意: 有n个学生,老师要带他们出去玩,但是老师比较保守,怕他们之间萌生爱意,所以带出去的所有同学必须至少满足四个条件中的一组,问最多能带多少人出去玩. 思路: 比较简单二分 ...
- WPF之自定义委托命令
常用命令 WPF的命令实际上就是实现了ICommand接口的类,平时使用最多的是RoutedCommand类,还可以使用自定义命令. RoutedCommand只负责跑腿,并不对命名目标做任何操作,实 ...
- 解决GET http://localhost:8080/js/layui/layui.js net::ERR_ABORTED 404
用ssm+layui在写页面的时候,发现无法找到资源路径 <script src="js/layui/layui.js" charset="utf-8"& ...
- vue 访问页面时报错 Failed to compile
这个是因为node-sass没安装好,所以要重新安装 windows下运行命令:npm install node-sass --registry=https://registry.npm.taobao ...
- 『政善治』Postman工具 — 7、Postman中保存请求(Collections集合)
目录 1.创建Collection 2.保存Request请求 3.查看保存的请求 4.Collection下还可以创建文件夹 5.补充:Postman中的变量 6.总结 1.创建Collection ...
- 微信小程序中的常见弹框
显示加载中的提示框 wx.showLoading() 当我们正在在进行网络请求时,常常就需要这个提示框 手动调用wx.hideLoading()方法才能够关闭这个提示框,通常在数据请求完毕时就应该关闭 ...
- Mybatis学习之自定义持久层框架(一) 为什么要用框架而不直接用JDBC?
前言 说起Mybatis,相信大家都不会感到陌生,它是一款优秀的持久层框架,应用于java后端开发中,为客户端程序提供访问数据库的接口. 我们都知道,JDBC是Java语言中用来规范客户端程序如何来访 ...