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(数据模型)获取数据,把 ...
随机推荐
- c 结构体内存对齐详解
0x00简介 首先要知道结构体的对齐规制 1.第一个成员在结构体变量偏移量为0的地址处 2.其他成员变量对齐到某个数字的整数倍的地址处 对齐数=编辑器默认的一个对齐数与该成员大小的较小值 vs中默认的 ...
- Unity2D项目-平台、解谜、战斗! 1.3移动组件
各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 在这一篇中,我们将会自顶向下地讨论本2D游戏中主角不可或缺的一个功能--移动控制. 首先我们简单分析一下2D游戏中主角与移动相 ...
- 简单模拟实现javascript中的call、apply、bind方法
目录 引子 隐式丢失 硬绑定 实现及原理分析 总体实现(纯净版/没有注释) 写在最后 引子 读完<你不知道的JavaScript--上卷>中关于this的介绍和深入的章节后,对于this的 ...
- 从一个Demo开始,揭开Netty的神秘面纱
本文是Netty系列第5篇 上一篇文章我们对于I/O多路复用.Java NIO包 和 Netty 的关系有了全面的认识. 到目前为止,我们已经从I/O模型出发,逐步接触到了Netty框架.这个过程中, ...
- 华为应用市场AppGallery Connect正式推出全新LOGO
华为应用市场AppGallery Connect(简称AGC)正式推出全新Logo,新Logo的设计灵感源于编码中的符号<>,两个括号紧密联结成一个正方形,寓意华为应用市场AGC与开发者深 ...
- Mysql之Mycat读写分离及分库分表
## 什么是mycat ```basic 1.一个彻底开源的,面向企业应用开发的大数据库集群 2.支持事务.ACID.可以替代MySQL的加强版数据库 3.一个可以视为MySQL集群的企业级数据库,用 ...
- 邮件功能 - yagmail 模块
简介 使用 yagmail 模块可以更简单地实现邮件发送功能. 安装:pip install yagmail 代码示例 1 import yagmail 2 3 def send_mail(repor ...
- G - G ZOJ - 2723 (素数打表+set)
Prime Number Definition An integer greater than one is called a prime number if its only positive di ...
- 到底什么才叫SEO
昨天去面试,公司的老板,问了我几个SEO的问题.SEO是什么?长尾词与关键词的区别?你用哪些SEO工具? SEO就是为了将关键词做上好的位置展示给用户.难道不是吗? 这些问题,我都答了一下. 然后他问 ...
- 关于csv文件最大行数和最大列数
excel 2003 =2^16 = 65 536 excel 2007 = 2^20 = 1048576 Excel2003,最大行数2^16=65536,最大列数256 Excel2007,最大行 ...