Python Flask结合前端Fetch实现表单无刷新提交与局部刷新

Dylan
Dylan
发布时间:2026-10-10| 1人浏览过
原创

本文详解如何利用原生 Fetch API 结合 Flask 构建前后端分离的异步交互逻辑。通过拦截表单默认提交行为、统一使用 JSON 格式通信,并配合 HTTP 状态码检查与 DOM 动态渲染,实现登录无刷新跳转及业务数据即时更新,彻底告别传统页面重载。

Fete 工作原理与基础环境

fetch() 是浏览器内置基于 Promise 的网络请求接口,用于替代传统的 XMLHttpRequest。调用时传入目标 URL 与配置对象,立即返回一个承诺对象。开发者需在 .then() 中链式处理响应数据,并通过 catch() 捕获网络或解析异常。该机制将 UI 渲染与后端数据逻辑解耦,使页面交互保持连续。

开发前需安装基础依赖并启用跨域支持:

pip install flask flask-cors

实操步骤与示例

第1步:初始化 Flask 跨域服务

目的:提供接收 JSON 数据、验证参数并返回结构化响应的 RESTful 接口。使用 flask-cors 可自动处理跨域预检请求,降低前端调试门槛。

from flask import Flask, request, jsonify
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route('/api/login', methods=['POST'])
def login():
    data = request.get_json()
    if data.get('username') == 'admin' and data.get('password') == 'secret':
        return jsonify({'success': True, 'redirect_url': '/dashboard'}), 200
    return jsonify({'success': False, 'message': '凭证错误'}), 401

if __name__ == '__main__':
    app.run(debug=True)

第2步:拦截表单提交与异步发请求

目的:阻断表单默认的同步跳转行为,将表单数据转换为 JSON 发送至指定 API,并根据后端返回结果执行界面逻辑。

const loginForm = document.getElementById('loginForm');
loginForm.addEventListener('submit', function(event) {
    event.preventDefault(); // 阻止页面刷新
    const formData = new FormData(this);
    const jsonData = Object.fromEntries(formData.entries());

    fetch('/api/login', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(jsonData)
    })
    .then(response => {
        // 关键步骤:先校验 HTTP 状态码范围(2xx表示成功)
        if (!response.ok) throw new Error(`请求失败: ${response.status}`);
        return response.json();
    })
    .then(result => {
        if (result.success) {
            window.location.href = result.redirect_url || '/';
        } else {
            document.getElementById('error-msg').textContent = result.message;
        }
    })
    .catch(err => console.error('网络异常:', err));
});

第3步:处理响应数据与 DOM 局部刷新

目的:在新增或修改数据成功后,不刷新整页,仅针对变更节点进行 DOM 插入或替换。后端需配合返回完整实体对象以便前端复用。

document.getElementById('saveBtn').addEventListener('click', () => {
    const newItem = { id: Date.now(), title: '新任务', status: 'pending' };

    fetch('/api/items', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(newItem)
    })
    .then(res => res.ok ? res.json() : Promise.reject(new Error('保存失败')))
    .then(savedItem => {
        const listEl = document.getElementById('itemList');
        const li = document.createElement('li');
        li.innerHTML = `${savedItem.title} - ${savedItem.status}`;
        listEl.appendChild(li);
    });
});

常见响应类型与排错策略

后端返回值除 JSON 外,也可能包含纯文本或 HTML 片段。处理文本时使用 response.text(),处理二进制流使用 response.blob()。无论类型如何,务必在解析前通过 response.ok 过滤服务端报错(如 400、500)。若直接对 HTML 错误页面调用 response.json(),将抛出 SyntaxError 导致后续链中断。此时可结合 try-catch 或 catch 分支统一展示用户友好提示。

总结

通过 fetch() 配合 Flask 的路由控制,可实现高内聚低耦合的异步表单提交与局部刷新逻辑。掌握 Promise 链式调用、response.ok 状态预判以及 DOM 动态挂载,即可构建体验接近原生应用的现代 Web 交互。以上就是利用 Fetch 与 Flask 实现表单无刷新提交与数据更新的详细内容,更多关于 JavaScript 异步请求与后端接口对接的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。