Python后端开发入门指南

发表时间: 2024-06-16 10:04

最近在看一本书,书名超酷,叫《学习之道》。作者是个天才,小时候去公园看人下棋,边看边学,把公园里的人都打败后,觉得没意思,就从全国象棋比赛少年组开始,打败全国冠军,再打败国际冠军。后来,他不下棋了,去学太极拳,打败了全国练太极拳的人,还拿了全国太极推手冠军。(作者是外国人,这里的国家指的是美国)。

读这本书就像读一本小说一样有趣。作者后来总结,不管是学习象棋、太极拳,还是其他知识,其实都有很多相似之处,这就是作者所说的学习之道。

看完之后我恍然大悟,自己获得了天才的智慧,观察生活之后,我也总结出一件事:其实写软件和写博客差不多,都是一个字:累。

以上内容与本文主题无关。

1.问题陈述

在开发一个 Web 应用时,我们通常会简单分为前端工程师和后端工程师(注:在一些比较复杂的系统中,前端可以分为外观和逻辑,后端可以分为 CGI 和 Server)。前端工程师负责浏览器用户界面和逻辑,后端负责数据的处理和存储。前端和后端的关系可以简单概括为:后端提供数据,前端负责展示数据。

在这种前后端分工之下,经常会有人产生一些疑惑:既然前端数据是由后端提供的,那后端数据接口不做完,前端不就可以编码了吗?前端和后端又如何独立开发呢?

考虑一下这种情况:Alex 和 Bob 是好朋友。他们有一个可以彻底改变世界的想法,并准备实现它,但他们不需要程序员,因为他们就是程序员。他们只是开始工作。Alex 编写前端,Bob 编写后端。

Alex 和 Bob 训练有素,一步步设计了产品的主要功能、交互原型、视觉设计,然后根据产品功能和交互开发了一堆很棒的前后端交互 API。这套 API 类似于 Alex 和 Bob 在开发时需要遵守的一套前后端开发“协议”。例如其中一个评论功能:

// API: Create New Comment v2// Ajax, JSON, RESTfulurl: /commentstype: POSTrequest: {content: “comment content.”, userId: 123456}response:- status: 200    data: {result: "SUCCESS", msg: "The comment has been created."}- status: 404    data: {result: "failed", msg: "User is not found."}

Alex 的前端需要以 POST 方式向 URL /comments 发送类似 {content: "评论内容.", userId: 123456} 的 JSON 请求数据;Bob 的服务器识别后,如果操作成功则返回 200 状态和上述 JSON 数据。不同的操作状态有不同的响应数据(为了简单起见,只列出了 200 和 404 两种)。

API 建立好之后,Alex 和 Bob 就开始写代码了,Alex 写了评论的外观和交互,但是到了评论功能的时候他就犯难了:现在需要发送 Ajax,但是因为是本地服务器,拿不到数据,所以只能写 Ajax 代码:

```python// jQuery Ajax$.ajax({ // 这个ajax直接报错,因为这个是Alex的前端服务器,请求无法获取数据;url: “/comments”,type: “POST”,data: {content: content, userId: userId},success: funtion(data) {// 这里不会被执行}})

相比较而言,Bob就没有这个担心,因为后端是基于测试驱动开发的,后端可以很方便地模拟前端发来的请求,可以在不依赖前端的情况下进行开发和测试。

Alex 把这个情况跟 Bob 说了,Bob 说,我们何不把代码拿到你本地前后端连接起来,然后我们就可以测试一下。Alex 觉得 Bob 真是个天才。

将前后端代码部署到 Alex 本地服务器后,经过一系列的测试和调试,他们终于成功对接了 API。然而他们发现这种方式并不科学:难道每写一个 API 都要测试前后端对接吗?而且,如果 Alex 需要测试某个 API,而 Bob 的 API 还没写完,Alex 的功能模块进度就会被“卡住”。

还有 168 个 API 需要编写,所以他们不能这么做。Alex 和 Bob 开始思考这个问题的解决方案。

2.解决方案

这种场景下,前端和后端存在着强数据依赖关系,后端依赖于前端的请求,前端依赖于后端的响应。后端可以很方便地模拟前端的请求(基本上任何能写后端的语言都可以直接发送HTTP请求),但前端对于模拟响应却没有一个明显的解决方案。因此,这里需要解决的点就是:如何为前端模拟响应数据。

我先从一个很形而上学的说法开始:如果两个对象存在强耦合关系,我们通常可以通过引入第三个对象来打破这种强耦合关系。

在上面描述的开发过程中,前后端耦合度太强了,我们需要用别的东西来打破它们的耦合度。所以,在确定了前后端接口之后,我们根据接口再搭建一个服务器,这个服务器会按照接口一一响应前端的请求,并返回数据,当然这些数据是假的数据,我们把这个服务器叫做 Mock Server,而 Bob 真正开发的那个服务器叫做 Real Server。

Mock Server 是基于 API 实现的,但是本身没有数据逻辑,只是简单的返回数据。例如 Alex 和 Bob 在 Mock Server 上发表评论的接口如下:

python // Mock Server // Create New Comment API route.post("/comments", function(req, res) { res.send(200, {result: "Success"}); }) Alex在开发的时候向Mock Server发出请求,而不是向Bob的服务器发出请求:python// Sending Request to Mock Server// jQuery Ajax$.ajax({url: config.HOST + “/comments”,type: “POST”,data: {content: content, userId: userId},success: funtion(data) {// OK}})

注意上面的 config.HOST。我们将服务器配置放在全局共享模块中:

python // 前端配置模块 var config = modules.exports; config.HOST = "" // Mock Server IP 所以上面我们其实就是用 IP 地址向 Mock Server 发送一个 POST 请求。当 Alex 和 Bob 写完代码后,需要连接调试。Alex 可以通过简单更改配置文件将所有请求重定向到 Bob 开发的 Real Server: python

// 前端配置模块

var 配置 = 模块.导出;

// config.HOST = ““ // 模拟服务器 IP

config.HOST = ““ //真实服务器域名

然后 Alex 和 Bob 就可以愉快地分开,独立开发,最后只需要一起调试就可以了。

总结一下,前后端分离开发基本包含以下几个步骤:

3.实施计划

Mock Server 应该如何搭建?应该存放在哪里?如何维护?

前端和后端是两个不同的项目,各自占用一个仓库,Mock Server要和它们分开,独立开发和维护,也就是会有三个仓库,Mock Server是一个独立的项目。

Mock Server可以部署在本地,也可以部署在远程服务器上,各自有其优点和缺点。

Mock Server 项目一般可以由后端开发人员维护。因为在开发过程中,后端可能因为各种原因需要修改 API。后端人员是最熟悉请求的响应数据和格式的人,他们可以同步维护 Mock Server 和 Real Server,以更好地保证数据的一致性。Mock Server 的维护并不复杂。对于大多数项目来说,这样的前期准备和流程维护是非常值得的。

终于

所以重点是:基于API构建一个可以模拟服务器响应的Mock Server,并用它来请求模拟的数据进行测试。

我们再总结一下,前后端分离开发包括以下几个步骤:

根据功能制定前后端接口。 搭建Mock Server项目,并根据接口进行部署。 独立开发前后端。 前端向Mock Server发送请求,获取模拟数据,用于开发和测试。 前后端完成后,进行前后端对接和调试。

当我是唯一的开发人员时,我更喜欢独立开发后端,开发前端时开一个 Real Server 来响应。这样既好玩又快捷。其实如果团队是全栈的,可以按照功能模块来划分任务,而不是划分为前端工程师和后端工程师。

但一般来说还是选择前后端功能划分,对于这种情况的多人开发的项目,前后端分离的开发方式的确需要考虑和构建,这样能更好的帮助我们构建高效、规范、精简的开发流程。

再说一遍,没有灵丹妙药,一切都需要根据实际情况构建独特的流程。

Dai Jiahua 创建于 2014 年 11 月 15 日 最后更新于 2014 年 11 月 15 日

原文链接