Django前后端分离概念解析

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

基本概念

什么是前后端分离

前后端分离

  • 前:浏览器
    • HTML、CSS、Bootstrap、JS、JQuery、Vue、NodeJS、webpack
    • 体验为主:炫酷流畅兼容
  • 后:服务端
    • Jvm、springboot、Django、flask、tornado、
    • 三高:高并发、高可用、高性能

传统的不分离

请添加图片描述
用户在浏览器上发送请求,服务器端接收到请求,根据 Header 中的 token 进行用户鉴权,从数据库取出数据,处理后将结果数据填入 HTML 模板,返回给浏览器,浏览器将 HTML 展现给用户,不分离的核心就是模版,比如 Django 直接将返回数据到模版,通过模版表单将数据返回至后端

  • 业务耦合较强

那这样就有一个问题,从事不分离的开发者,一般需要懂数据库懂框架操作、懂模版前端,小型项目还好,一个人可以抗的下来,你可以加班,但如果项目较大,一个人无法独立完成,需要团队合作


  • 指责划分不明确

并且不分离的情况,所有的业务、代码、逻辑都在一套服务体系内,会造成团队之间沟通混乱,代码风格不统一,每个人的前后端技能水平层次不齐的水平,出了问题找背锅的人更慢,无法快速找到罪魁祸首


  • 开发成本较高

除此之外,不分离还有一个问题,现在的服务,比如一个电商平台,除了WEB端之外,还会有 IOS 端、安卓端的各种 APP,本质上这些软件 APP 用的都是同一套数据,但是现在除了每一套前端的应用界面,由于不分离的情况,还需要给每一个平台不同的 APP 开发多套后端,这个开发成本是很高的,需要很多很多的不同语言的开发者


  • 服务器压力较大

此外页面的渲染本应该是在客户端完成,但是现在都是在服务端渲染好之后再返回给用户,那么在高并发的情况下,会大量占用服务器的资源

  • 提高 SEO 速度,提高搜索引擎收录检索速度

当然,不分离也有好处,页面数据都是渲染好返回的,可以有效提高 SEO的速度


现在的前后端分离

请添加图片描述

数据渲染的工作在客户端浏览器,不需要服务端完成,服务端专注于提供数据

那么这就要求Django框架不需要返回一个模版页面,而是返回一套***JSON***数据,而由于***JSON***可以在多种语言中支持,是一种交互、兼容非常合适的语言格式,所以现在后台常返回的数据都为**JSON格式的,这个过程也称作序列化


  • 部署解耦

前后端分离再就是部署压力较小,前后端分离部署,可以分离业务,起码在后端宕机时,前端还可以正常服务


  • 业务划分清晰,指责更为明确

后端工程师只需要专注于编写接口,从数据库提取数据,进行逻辑处理,并返回给前端,而前端怎么去渲染,怎么写样式,用什么前端,这都不是后端工程师需要考虑的,后端要做好的就一件事,写好接口就可以


  • 开发成本较低,一套后台可以支持多套前端渲染

一般来说,一套接口编写好之后,业务相同的情况下,是可以在多种 app 端、pc 端进行渲染展示的,不需要额外开发多套耦合的服务,这就很省钱了


  • SEO 优化较差,需要引入一些页面静态化手段

但是前后端分离也有不好的地方,在于页面数据的渲染是需要花费时间的,数据并不是渲染好返回给用户,所以可能会出现白屏时间,并且影响搜索引擎爬虫的检索收录

什么是restful风格

在前后端分离的应用模式里,API接口如何定义?

例如:对于后端数据库中保存了商品的信息,前端可能需要对商品数据进行增删改查,那相应的每个操作后端都需要提供一个API接口:

  • POST /add-goods 增加商品
  • POST /delete-goods 删除商品
  • POST /update-goods 修改商品
  • GET /get-goods查询商品信息

对于接口的请求方式与路径,每个后端开发人员可能都有自己的定义方式,风格迥异。

是否存在一种统一的定义方式,被广大开发人员接受认可的方式呢?

这就是被普遍采用的*API*的RESTful设计风格。

RestFul 规范建议

域名要有标示

Restful 风格建议,Api 服务器的域名要尽量在专用域名之下

如:百度面向用户的站点地址为https://baidu.com

那么后端的接口地址可以为

https://api.baidu.com

也可以放在连接之后

https://baidu.com/api/

路由中体现接口版本号

如果你的接口会不停的升级,那么建议你把接口的版本号维护在URL中,比如图灵机器人就是这么干的,API 的升级会把版本放入连接

https://api.baidu.com/v1/
https://baidu.com/api/v1/
http://openapi.tuling123.com/openapi/api/v2

使用合理的请求方式

对应操作,应该返回操作后的资源结果,比如获取数据,那就应该使用***GET***请求方式

如果是更新数据,那么建议你使用***PUT***或***PATCH***方法

  • GET:获取数据
  • POST:提交数据,创建数据
  • PUT:提交数据,更新数据
  • DELETE:删除数据

还有三个不常用的HTTP动词

  • PATCH:在服务器更新(更新)资源
  • HEAD:获取资源的元数据。
  • OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的

提供参数过滤数据

如果数据较多,返回所有数据是不现实的,那么可以让API提供参数,进行结果返回

?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件

使用合理的状态码

接口返回数据,还要带上合理的状态码进行标记

200 OK - [GET] # 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH] # 用户新建或修改数据成功。
202 Accepted - [*] # 表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE] # 用户删除数据成功。

400 INVALID REQUEST - [POST/PUT/PATCH] # 用户发出的请求有错误,服务器没有进行新建或修改数据的操作
401 Unauthorized - [*] # 表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] # 表示用户得到授权(与 401 错误相对),但是访问是被禁止的。
404 NOT FOUND - [*] # 用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET] # 用户请求的格式不可得(比如用户请求 JSON 格式,但是只有 XML 格式)。
410 Gone -[GET] # 用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] # 当创建一个对象时,发生一个验证错误。

500 INTERNAL SERVER ERROR - [*] # 服务器发生错误,用户将无法判断发出的请求是否成功

什么是接口及接口文档

API,全称是Application Programming Interface,即应用程序编程接口,我们日常中习惯简称为“接口”。其实,接口这个词大家应该不会陌生,比如我们平时比较常用的“USB接口”,就是用来存储和传输数据用的;

那什么是API呢,API事实上是在内部预先定义了函数,能够使开发人员无须明白API内部实现的机制,就能够实现某一个功能。

比如说你要实现一个手机注册的功能,那么相应地后台工程师就需要提供一个手机注册的接口,前端开发人员在调用接口实现功能的时候,只需按照既定的规则进行请求即可,不需要去理解该功能的实现逻辑。有了这么一个机制,就使得开发人员间的协作变得非常简洁、高效。

所以,你可以简单地理解为“接口决定了功能”。

接口文档又称为API文档,一般是由开发人员所编写的,用来描述系统所提供接口信息的文档。 大家都根据这个接口文档进行开发,并需要一直维护和遵守。

为什么要写接口文档?
1、项目开发过程中前后端工程师有一个统一的文件进行沟通交流开发
2、项目维护中或者项目人员更迭,方便后期人员查看、维护

如何阅读接口文档

API接口文档一般分为接口描述、接口地址、请求方法、请求参数、响应内容、错误代码、实例几个部分:

接口描述: 简单描述接口的逻辑和作用。例如说明这是一个发送消息的接口、查询天气的接口;

接口地址: 这个地址表示的是网络地址,即url,我们需要调用接口url,获取响应内容;

请求方法: 常见的请求方法为GET和POST,其他的方式见下图;

请求参数: 用来传递信息的变量。即需要请求的字段名的名称和规则:都是哪些字段,字段的类型是什么,是否必填字段等等;

  • URL传参
  • Headers 请求头
  • Body 请求内容

响应内容: 接口返回的字段名称和规则;

错误代码: 对接口的错误用代码进行归类,以便能快速找到错误原因,解决问题;

实例: 实际调用时的响应的内容。


以阿里云API市场为例:

获取access_token

【注意】正常情况下access_token有效期为7200秒,有效期内重复获取返回相同结果,并自动续期。

调试工具在线调试

请求方式:GET(HTTPS)

请求地址https://oapi.dingtalk.com/gettoken?appkey=key&appsecret=secret

参数说明

参数 类型 必须 说明
appkey String 应用的唯一标识key
appsecret String 应用的密钥

Guess you like

Origin blog.csdn.net/HeroicLee/article/details/121529837