一. WEB应用模式

在开发Web应用中,有两种应用模式

1. 前后端不分离

把html模板文件和django的模板语法结合渲染完成以后才从服务器返回给客户。

2. 前后端分离

二. API接口

API(Application Programming Interface,应用程序接口)

为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本。

目前市面上大部分公司开发人员使用的接口服务架构主要有:restful、rpc。

1. rpc

rpc: 翻译成中文:远程过程调用[远程服务调用].

http://www.example.com/api

post请求

action=get_all_student¶ms=301&sex=1

接口多了,对应函数名和参数就多了,前端在请求api接口时,就会比较难找.容易出现重复的接口。

2. restful

restful: 翻译成中文: 资源状态转换.

把后端所有的数据/文件都看成资源.

那么接口请求数据,本质上来说就是对资源的操作了.

web项目中操作资源,无非就是增删查改.所以要求在地址栏中声明要操作的资源是什么,然后通过http请求动词来说明对资源进行哪一种操作.

POST http://www.example.com/api/students/ 添加学生数据

GET http://www.example.com/api/students/ 获取所有学生

DELETE http://www.example.com/api/students/<pk> 删除1个学生

两种没有好坏之分。

三.RESTful API

1.什么是RESTful

REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”

REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态

所有的数据,不管是通过网络获取的还是操作数据库获得(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性

对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)

对互联网上的任意东西都视为资源,他认为一个url就是一个资源 比如:http://www.xxx.com/get_user/

2.什么是API?

答:API就是接口,提供的url。接口有两个用途:

为别人提供服务

前后端分离,一个写vue,一个写后端,他们之间都是通过ajax请求

3.RESTful API规范

RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中。

  这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。而对于数据资源分别使用POST、DELETE、GET、PUT等请求动作来表达对数据的增删查改。

事实上,我们可以使用任何一个框架都可以实现符合restful规范的API接口。

参考文档:http://www.runoob.com/w3cnote/restful-architecture.html

四. 序列化

api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式。

序列化可以分两个阶段:来反去序

1.序列化

  把我们识别的数据转换成指定的格式提供给别人。

  例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。

2.反序列化

  把别人提供的数据转换/还原成我们需要的格式。

例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。

五.Django Rest_Framework

核心思想: 缩减编写api接口的代码

Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。REST framework提供了一个API 的Web可视化界面来方便查看测试接口。

中文文档:https://q1mi.github.io/Django-REST-framework-documentation/#django-rest-framework

github: https://github.com/encode/django-rest-framework/tree/master

特点:

提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;

提供了丰富的类视图、Mixin扩展类,简化视图的编写;

丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;

多种身份认证和权限认证方式的支持;[jwt]

(json,web,tokens)

内置了限流系统;

直观的 API web 界面;

可扩展性,插件丰富。

六.环境安装与配置

DRF需要以下依赖:

Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)

Django (1.10, 1.11, 2.0)

DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建。(若没有Django环境,需要先创建环境安装Django)

1.安装DRF(djangorestframework)

前提是已经安装了django,建议安装在虚拟环境

关于虚拟环境的安装参考(以后自己再总结怎样安装):https://www.cnblogs.com/maybach/p/9801936.html

# mkvirtualenv drfdemo -p python3

# pip install django

pip install djangorestframework

pip install pymysql

linux 复制 shift+insert

2.创建django项目

django-admin startproject drfdemo

使用pycharm打开项目,设置虚拟环境的解析器,并修改manage.py中的后缀参数。

3.添加rest_framework应用

在settings.py的INSTALLED_APPS中添加'rest_framework'。

INSTALLED_APPS = [

...

'rest_framework',

]

接下来就可以使用DRF提供的功能进行api接口开发了。在项目中如果使用rest_framework框架实现API接口,主要有以下三个步骤:

将请求的数据(如JSON格式)转换为模型类对象

操作数据库

将模型类对象转换为响应的数据(如JSON格式)

4.体验drf完全简写代码的过程

(1)创建模型操作类

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

models.py

为了方便测试,所以我们可以先创建一个数据库。

执行数据迁移

把students子应用添加到INSTALL_APPS中

主引用中__init__.py设置使用pymysql作为数据库驱动

import pymysql

pymysql.install_as_MySQLdb()

settings.py配置文件中设置mysql的账号密码

DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# },
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "students",
"HOST": "127.0.0.1",
"PORT": 3306,
"USER": "root",
"PASSWORD":"",
},
}

DATABASES

上面数据库的配置,根据自己数据库的账号密码和数据库名做相应的配置。

终端下,执行数据迁移。

python manage.py makemigrations

python manage.py migrate

错误列表

# 执行数据迁移 python manage.py makemigrations 报错如下:

注释掉 backends/mysql/base.py中的35和36行代码。

backends/mysql/operations.py146行里面新增一个行代码:

query = query.encode()

(2)创建序列化器

例如,在django项目中创建学生子应用。

python manage.py startapp students

在syudents应用目录中新建serializers.py用于保存该应用的序列化器。

创建一个StudentModelSerializer用于序列化与反序列化。

# 创建序列化器类,回头会在试图中被调用

from rest_framework import serializers
from students.models import Student # 创建序列化器类,回头会在试图中被调用
class StudentModelSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = "__all__"

model指明该序列化器处理的数据字段从模型类BookInfo参考生成

fields指明该序列化器包含模型类中的哪些字段,'__all__'指明包含所有字段

(3)编写视图

在students应用的views.py中创建视图StudentViewSet,这是一个视图集合。

from rest_framework.viewsets import ModelViewSet
from .models import Student
from .serializers import StudentModelSerializer
# Create your views here.
class StudentViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer

views.py

queryset指明该视图集在查询数据时使用的查询集

serializer_class指明该视图在进行序列化或反序列化时使用的序列化器

(4) 定义路由

在students应用的urls.py中定义路由信息。

from . import views
from rest_framework.routers import DefaultRouter # 路由表
urlpatterns = [] router = DefaultRouter() # 可以处理视图的路由器
router.register('students', views.StudentViewsSet) # 向路由器中注册视图集 urlpatterns += router.urls # 将路由器中的所有路由信息追到django的路由列表中

最后把students子应用中的路由文件加载到总路由文件中,总urls.py进行的是路由分发

from django.contrib import admin
from django.urls import path, include urlpatterns = [
path('admin/', admin.site.urls),
path('stu/', include("students.urls")),
path('sers/', include("sers.urls")),
path('req/', include("req.urls")) ]

(5)运行测试

运行当前程序(与运行Django一样)

python manage.py runserver

在浏览器中输入网址127.0.0.1:8000,可以看到DRF提供的API Web浏览页面:

点击链接127.0.0.1:8000/stu/students 可以访问获取所有数据的接口,呈现如下页面:

在页面底下表单部分填写学生信息,可以访问添加新学生的接口,保存学生信息:

点击POST后,返回如下页面信息(就是刚添加的信息):

这样我们再添加几条信息。

在浏览器中输入网址127.0.0.1:8000/stu/students/3/,可以访问获取单一学生信息的接口(id为3的学生),呈现如下页面:

在页面底部表单中填写学生信息,可以访问修改学生的接口:

上图对原来数据修改的地方。

点击PUT,返回如下页面信息数据被修改。数据库中的数据也修改了见下图查表的数据。

点击DELETE按钮,可以访问删除学生的接口。

再次查询表数据发现id=3的数据已经删除。首先是页面返回Not found的结果,然后是数据表剩余的数据。

七.序列化器-Serializer

详情请见:序列化器-Serializer

Django 学习之Django Rest Framework(DRF)的更多相关文章

  1. Django学习之django自带的contentType表 GenericRelation GenericForeignKey

    Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...

  2. day 94 Django学习之django自带的contentType表

    Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...

  3. day 93 Django学习之django自带的contentType表

    Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...

  4. Django学习之django自带的contentType表

    Django学习之django自带的contentType表 通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/aar ...

  5. day 91 Django学习之django自带的contentType表

      Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net ...

  6. django学习-10.django连接mysql数据库和创建数据表

    1.django模型 Django对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django为这些数据库提供了统一的调用API. 我们可以根据自己 ...

  7. Django学习笔记 Django的工程目录

    mysite├── manage.py 管理项目:包括数据库建立.服务器运行.测试……└── mysite    ├── __init__.py     ├── settings.py 配置文件:应用 ...

  8. Django学习day3——Django的简单使用

    开始一个项目 切换到django的虚拟环境中 执行: django-admin startproject mysite 创建第一个django项目mysite django生成的目录如下: E:. └ ...

  9. Django 学习之Django Rest Framework_序列化器_Serializer

    作用: 1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串. 2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型. 3 ...

随机推荐

  1. 设置DataGridView的单元格颜色

    RowPrePaint事件: private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArg ...

  2. Codeforces Round #599 (Div. 2) C. Tile Painting

    Ujan has been lazy lately, but now has decided to bring his yard to good shape. First, he decided to ...

  3. Atcoder Beginner Contest152F(DFS+状压DP)

    二维状压写成一维状压,省略加上第i条边这一维 #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace st ...

  4. c# pcm

    using System; using System.IO; using System.Text; using System.Windows.Forms; using System.Runtime.I ...

  5. PowerDesigner 16.5安装、激活

    PowerDesigner安装 PowerDesigner激活 PowerDesigner运行

  6. 算法进阶:0x01 位运算

    一.快速幂的模板代码 a^b%p: #include<iostream> using namespace std; int main() { int a,b,p; cin>>a ...

  7. AD10如何新建一个集成库

    1.新建一个集成库工程 2.添加原理图库 3.添加封装库 4.最关键的一步:对这个工程需要进行编译 5.在界面的右边就能看到自己建的封装库了

  8. php将数据写入另外一个文件

    有时候,为了验证PHP的运行过程或者了解代码中的变量的使用情况,需要将变量写到另外一个文件中,方便我们查看.最近也是经常用到file_put_contents这个函数,因为只是试验用,暂时还不需要考虑 ...

  9. Could not find result map com.youotech.tl_cons_credit_rating.entity.Result

    后端报错如下: java.lang.IllegalArgumentException: Result Maps collection does not contain value for com.yo ...

  10. js开关菜单

    开关菜单 /* 将需要的信息添加到类的静态数组里备用 设置一个值openBool,默认为false:菜单默认display为none 点击时,如果目标元素是子元素,则不做开关菜单操作,直接return ...