在开发Web应用中,有两种应用模式:
-
前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。]
2.
前后端分离
[把前端的界面效果(html,css,js分离到另一个服务端,python服务端只需要返回数据即可]。前端形成一个独立的网站,服务端构成一个独立的网站
什么是API?
如果我们把前端页面看作是一种用于展示的客户端,那么 API 就是为客户端提供数据、操作数据的接口。
例如:我们经常使用的淘宝商城就有很多的客户端,Web, iOS 和 Android端,但是当我们在 Web 端搜索商品时得到的结果和在 iOS 和 Android 端得到的结果却是一样的。这是因为,我们在不同客户端搜索的时候,都访问了后端同一个 API 。这样后端针对前端的同一种需求,只需开发一种接口,就可满足前端不同终端对于该资源的调用,大大降低了开发工作量,节约了开发时间。
目前市面上大部分公司开发人员使用的接口服务架构主要有:restful、rpc、soap。
什么是RESTful API?
将所有的事物抽象为资源,资源对应唯一的标识。RESTful为表现层状态转移,是一种以资源为中心的web软件架构风格。
资源:使用URL指向一个实体。
表现层:资源的表现形式;比如图片、HTML文本等。
状态转移:使用GET/ POST/ PUT/ DELETE等HTTP动词操作资源,实现资源状态转变。
RESTful风格的API即为RESTful API。通过GET/ POST/ PUT/ DELETE来获取/新建/更新/删除资源。一般使用JSON格式返回数据。大多数web框架都有相应的插件支持RESTful API。
RESTful API设计规范
HTTP方法 | url | 动作 |
GET | http://[hostname]/api/users | 检索用户列表 |
GET | http://[hostname]/api/users/[user_id] | 检索单个用户 |
POST | http://[hostname]/api/users | 创建新用户 |
PUT | http://[hostname]/api/users/[user_id] | 更新用户信息 |
DELETE | http://[hostname]/api/users/[user_id] | 删除用户 |
什么是序列化和反序列化?
两者都是数据转换格式,比如我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以需要把数据进行序列化,变成字符串或者json数据,提供给别人,这是序列化。
再比如前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样才能把数据保存到数据库中,这是反序列化。
Django Rest framework
Django REST framework是一个内置在django里面的子应用,可以快速的开发REST API接口应用。
安装
pip install djangorestframework
pip install markdown # 为browsable API 提供Markdown支持。
pip install django-filter # Filtering支持。
创建Django项目
django-admin startproject drfdemo
在settings.py下添加APP
INSTALLED_APPS = [
...
'rest_framework',
]
在项目中如果使用rest_framework框架实现API接口,主要有以下三个步骤:
-
将请求的数据(如JSON格式)转换为模型类对象
-
通过模型类对象进行数据库操作,完成客户端请求的增删查改
-
将模型类对象转换为响应的数据(如JSON格式)
接下来以学生管理为例介绍下使用drf写代码的过程:
创建子应用:
python manage.py startapp students
添加子应用到settings
INSTALLED_APPS = [
...
'students',
]
创建students/models.py模型类对象:
from django.db import models
# Create your models here.
sex_choice = (
(0, '女'),
(1, '男'),
)
class Students(models.Model):
# 表字段声明
name = models.CharField(null=False, max_length=20, verbose_name="姓名")
age = models.IntegerField(verbose_name="年龄")
sex = models.IntegerField(choices=sex_choice, default=1, verbose_name="性别")
class_name = models.CharField(max_length=20, verbose_name="班级名称")
description = models.TextField(max_length=200, verbose_name="个人简介")
# 表信息
class Meta:
# 声明数据表名
db_table = "tb_students"
verbose_name = "学生"
verbose_name_plural = verbose_name
# 模型的操作方法
def __str__(self):
return self.name
输入密码后创建数据库
mysql -uroot -p
mysql> create database students charset=utf8;
Query OK, 1 row affected (0.04 sec)
mysql> use students;
Database changed
mysql> show tables;
Empty set (0.02 sec)
Django连接mysql数据库
pip install pymysql
在主应用的__init__.py中设置pymysql作为数据库驱动
import pymysql
pymysql.install_as_MySQLdb()
settings.py中配置账号密码
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "students",
"HOST": "127.0.0.1",
"PORT": 3306,
"USER": "root",
"PASSWORD": "rootroot",
}
}
数据迁移
python manage.py makemigrations
python manage.py migrate
创建序列化器
首先我们要定义一些序列化程序,子应用下创建serializers.py。
StudentModelSerializer类用于处理序列化与反序列化。
from rest_framework import serializers
from .models import Students
class StudentModelSerializer(serializers.ModelSerializer):
# 需要进行数据转换的字段
# 当前转换的模型类相关声明
class Meta:
model = Students
fields = "__all__" # 对所有字段操作
# 验证数据的方法[反序列化:接收客户端的数据]
# 操作数据的带密码[反序列化:保存数据(添加/更新)]
编写视图views.py
from django.shortcuts import render
# Create your views here.
from rest_framework.viewsets import ModelViewSet
from .models import Students
from .serializers import StudentModelSerializer
# 使用类视图CBV创建,取到queryset后进行序列化操作
class StudentAPIView(ModelViewSet):
queryset = Students.objects.all() # 指明该视图的查询集
serializer_class = StudentModelSerializer # 指明使用的序列化器
在students下创建urls.py定义路由
from .views import StudentAPIView
from rest_framework.routers import DefaultRouter
urlpatterns = []
router = DefaultRouter() # 处理视图的路由器
router.register("stu", StudentAPIView) # 向路由器中注册视图集
urlpatterns += router.urls # 将路由器列表追加写入django的路由列表中
在总路由中添加students子应用的路由
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('students/', include("students.urls"))
]
# django.urls.path 用于编写字符串路由
# django.urls.re_path 用于编写正则路由
测试API,命令行启动服务器
python manage.py runserver
可以从命令行访问我们的API,使用诸如
curl
curl: 利用URL语法在命令行方式下工作的开源文件传输工具。
curl -X get "http://127.0.0.1:8000/students/"
直接访问http://127.0.0.1:8000/students/stu/ 添加学生
在Student Api List中可以查看所有学生信息,也可以进行增删查改(POST/DELETE/GET/PUT)
也可以通过携带用户id的url访问单个用户
http://127.0.0.1:8000/students/stu/2/
稀有物种女程序猿,日更python、网络、算法等相关知识。日拱一卒。欢迎各位催更扯淡一条龙!