一 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格式)转换为模型类对象
-
操作数据库
-
配置模型类
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") # 也可指定字段
-
-
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
-
-
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等请求操作数据