前端和后端是相互独立的两个模块,通过 API 接口进行通信。这种架构有助于更好地分工合作,提高开发效率,并支持不同平台和设备上的应用程序。

以下是前后端分离架构的一般流程和关键概念:

前端(Frontend):

  1. 界面设计与开发: 前端开发人员负责设计和开发用户界面。他们使用 HTML、CSS 和 JavaScript 等技术来创建交互式界面和用户体验。
  2. 数据获取和显示: 前端应用通过 API 调用从后端获取数据。常见的方法是使用 XMLHttpRequest 或 Fetch API 来请求数据,并在用户界面上显示数据。
  3. 交互逻辑: 前端负责处理用户的交互行为,例如按钮点击、表单提交等。这些行为可以触发 API 请求,或在前端直接处理数据。
  4. 状态管理: 复杂的前端应用可能需要使用状态管理库(如 Redux、Vuex、Mobx)来管理应用的状态,确保数据的一致性和可控性。

后端(Backend):

  1. 业务逻辑处理: 后端开发人员负责处理业务逻辑,对接数据库,执行数据操作,并生成 API 以供前端调用。
  2. API 开发: 后端开发人员设计和开发 API,定义了前端可以调用的接口,以及接口的参数、返回值等信息。
  3. 数据库管理: 后端处理数据存储和检索,可以使用数据库系统如 MySQL、MongoDB 等。
  4. 安全性和认证: 后端需要处理用户认证、数据安全、跨域问题等。

通信和数据交换:

  1. API 接口: 前端通过 API 接口来请求后端数据。这些接口可以采用不同的协议,如 RESTful API、GraphQL 等。
  2. 数据格式: 前后端之间通过 JSON 等数据格式进行数据交换。前端发送请求并接收后端响应,以实现数据的显示和交互。

部署和维护:

  1. 前端部署: 前端应用可以部署在静态文件服务器上,如 CDN、云存储等。
  2. 后端部署: 后端服务可以部署在云服务器、虚拟主机等,以供前端应用调用。

前后端分离架构允许前端和后端分别进行开发、测试和部署,提高了团队合作效率。同时,它也允许更好地扩展和维护,因为前后端可以独立地进行改进和升级,而不会影响整体系统的稳定性。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {{ bootstrap.load_css() }}
    {{ bootstrap.load_js() }}
</head>
<body>
<div>
    <div class="row" style="margin-right: 10px;">
        {# 创建4个按钮,给按钮存一个变量 data-path #}
        <button type="button" class="btn btn-primary" id="butt1" data-path="C">清空</button>
        <button type="button" class="btn btn-primary" id="butt1" data-path="b1">b1</button>
        <button type="button" class="btn btn-primary" id="butt1" data-path="b2">b2</button>
        <button type="button" class="btn btn-primary" id="butt1" data-path="b3">b3</button>
    </div>

    <div id="app">
        {# 可变区域 #}
        <h1>123</h1>
    </div>
</div>

<!-- jQuery and JavaScript Bundle with Popper -->
<script src="https://030399.xyz/upload/CDN/jquery-3.7.0.js"></script>
<script>

    // 绑定 class btn-primary 点击时间
    $(".btn-primary").click(function () {
        let domdata = ""
        var path = $(this).data("path");    // 取按钮标签内data-path的值
        //console.log(path)
        if (path === "C") {
            $("#app").empty(); // 清空
        } else if (path === "b1" || path === "b2" || path === "b3") {
            // 通过get请求往后端发送请求
            $.get("/" + path, function (data) {
                $("#app").empty(); // 清空            
                $("#app").append(data); // 添加
            });
        }
    })

</script>
</body>
</html>
from gevent import monkey
from gevent.pywsgi import WSGIServer

monkey.patch_all()

import datetime
import os
from multiprocessing import cpu_count
from multiprocessing.dummy import Process
from flask import Flask, jsonify, redirect, render_template
from flask_bootstrap import Bootstrap5

app = Flask(__name__)
# 实例化一个Bootstrap5对象并关联flask
bootstrap = Bootstrap5(app=app)

# 本地加载bootstrap,默认使用CDN加载bootstrap
app.config['BOOTSTRAP_SERVE_LOCAL'] = True


@app.route("/cppla", methods=['GET'])
def function_benchmark():
    return jsonify(
        {
            "status": "ok",
            "time": datetime.datetime.now().strftime('%Y-%m-%d %H:%M'),
            "pid": os.getpid()
        }
    ), 200


@app.route("/")
def index():
    return redirect("/index")


@app.route("/index")
def home():
    return render_template("index.html")


@app.route("/b1")
def b1():
    return render_template("b1.html", msg="haha")


@app.route("/b2")
def b2():
    return render_template("b2.html")

@app.route("/b3")
def b3():
    return render_template("b3.html")


def run(MULTI_PROCESS):
    if MULTI_PROCESS == False:
        WSGIServer(('0.0.0.0', 8080), app).serve_forever()
    else:
        mulserver = WSGIServer(('0.0.0.0', 8080), app)
        mulserver.start()

        def server_forever():
            mulserver.start_accepting()
            mulserver._stop_event.wait()

        for i in range(12):
            p = Process(target=server_forever)
            p.start()


if __name__ == "__main__":
    # 单进程 + 协程
    # run(False)
    app.run(debug=True)
    # 多进程 + 协程
    # run(True)