最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Flask結(jié)合前端Fetch搞定表單提交和頁面刷新

 更新時間:2025年12月30日 08:48:26   作者:曲幽  
本文帶你深入理解現(xiàn)代前端 Fetch API 的工作原理,并手把手教你如何與 Flask 后端優(yōu)雅結(jié)合,實現(xiàn)無刷新登錄、數(shù)據(jù)動態(tài)增刪改查等交互,感興趣的小伙伴可以了解下

亮點包括:Fetch 核心原理剖析、登錄重定向的異步處理、利用響應(yīng)狀態(tài)碼動態(tài)更新UI、以及如何處理JSON/文本等不同格式的返回數(shù)據(jù)。

你將學到:

  • Fetch API 的“承諾”機制與基礎(chǔ)用法
  • 如何用 Flask 構(gòu)建 RESTful 風格的 API 端點
  • 登錄表單提交:告別傳統(tǒng)表單刷新,實現(xiàn)平滑跳轉(zhuǎn)
  • 數(shù)據(jù)操作:前端一個請求,后端處理,前端UI即時響應(yīng)
  • 根據(jù)后端返回的不同數(shù)據(jù)類型(JSON/Text)進行精準處理

1. 初識Fetch:現(xiàn)代Web的通信信使

fetch() 是瀏覽器提供的、基于 Promise 的現(xiàn)代網(wǎng)絡(luò)請求API。它取代了古老的 XMLHttpRequest,讓異步數(shù)據(jù)請求變得清晰、簡潔。你可以把它想象成一個專業(yè)的“信使”。

它的基本工作流程是:你給信使(fetch)一個地址(URL)和指示(配置對象),它立刻返回一個“承諾收據(jù)”(Promise)。這個承諾最終會兌現(xiàn)為“響應(yīng)包裹”(Response對象),你需要打開這個包裹(調(diào)用如.json(), .text()等方法)才能拿到里面的真實數(shù)據(jù)。

// 一個最簡單的GET請求示例
fetch('/api/data')
  .then(response => response.json()) // 打開包裹,解析JSON數(shù)據(jù)
  .then(data => console.log(data))   // 處理真實數(shù)據(jù)
  .catch(error => console.error('出錯啦:', error)); // 處理錯誤

2. 實戰(zhàn)準備:Flask后端的簡單配置

為了讓前端Fetch能順利與后端“對話”,我們需要一個能處理JSON、并能進行跨域資源共享(CORS)的Flask應(yīng)用。首先,安裝必要庫:

pip install flask flask-cors

接著,搭建一個基礎(chǔ)的后端服務(wù):

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

app = Flask(__name__)
CORS(app)  # 允許前端跨域請求,開發(fā)時非常方便

# 我們將在后續(xù)場景中逐步填充這個app的路由
if __name__ == '__main__':
    app.run(debug=True)

3. 場景一:登錄表單提交與頁面重定向

傳統(tǒng)表單提交會刷新頁面,體驗割裂。使用Fetch,我們可以實現(xiàn)無刷新登錄,并根據(jù)后端指令進行前端路由跳轉(zhuǎn)。

前端 (JavaScript):攔截表單提交事件,使用Fetch發(fā)送數(shù)據(jù)。

document.getElementById('loginForm').addEventListener('submit', function(event) {
    event.preventDefault(); // 阻止表單默認提交行為

    const formData = new FormData(this);
    // 或者將數(shù)據(jù)轉(zhuǎn)換為JSON: JSON.stringify(Object.fromEntries(formData))

    fetch('/api/login', {
        method: 'POST',
        body: formData, // 發(fā)送FormData對象
        // headers: { 'Content-Type': 'application/json' }, // 如果發(fā)送JSON需設(shè)置此header
    })
    .then(response => response.json()) // 解析后端返回的JSON
    .then(result => {
        if (result.success) {
            // 登錄成功,使用前端路由跳轉(zhuǎn),而非后端重定向
            window.location.href = result.redirect_url || '/dashboard';
        } else {
            // 登錄失敗,動態(tài)更新頁面上的錯誤提示元素
            document.getElementById('error-msg').textContent = result.message;
        }
    })
    .catch(error => console.error('Error:', error));
});

后端 (Flask):驗證數(shù)據(jù),返回包含狀態(tài)和指令的JSON,而不是直接返回重定向的HTML。

@app.route('/api/login', methods=['POST'])
def login():
    username = request.form.get('username')
    password = request.form.get('password')

    # 這里應(yīng)是你的驗證邏輯,例如查詢數(shù)據(jù)庫
    if username == 'admin' and password == 'secret':
        # 返回成功狀態(tài)和前端跳轉(zhuǎn)地址
        return jsonify({'success': True, 'redirect_url': '/dashboard'})
    else:
        # 返回失敗狀態(tài)和錯誤信息
        return jsonify({'success': False, 'message': '用戶名或密碼錯誤'}), 401

4. 場景二:動態(tài)新增與修改數(shù)據(jù)

在管理系統(tǒng)中,新增或修改一條數(shù)據(jù)后,我們希望列表能立即更新,而無需刷新整個頁面。

核心思路:Fetch請求成功后,在.then()中根據(jù)后端返回的最新數(shù)據(jù),直接操作DOM更新UI。

// 假設(shè)有一個保存按鈕,用于提交新增或修改的數(shù)據(jù)
saveButton.addEventListener('click', () => {
    const itemData = { title: '新項目', status: 'active' };

    fetch('/api/items', {
        method: 'POST', // 新增用POST,修改可能是PUT或PATCH
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(itemData)
    })
    .then(response => response.json())
    .then(newItem => {
        // 關(guān)鍵步驟:請求成功后,動態(tài)更新前端列表
        const itemList = document.getElementById('itemList');
        const newItemElement = document.createElement('li');
        newItemElement.id = `item-${newItem.id}`;
        newItemElement.innerHTML = `${newItem.title} ${newItem.status}`;
        itemList.appendChild(newItemElement);

        // 或者,如果是修改操作,可以找到對應(yīng)的DOM元素更新其內(nèi)容
        // const oldItemElement = document.getElementById(`item-${newItem.id}`);
        // oldItemElement.innerHTML = ...;

        alert('操作成功!'); // 或更優(yōu)雅的提示
    });
});

對應(yīng)的Flask后端需要返回創(chuàng)建或更新后的完整數(shù)據(jù)對象,以便前端使用。

5. 場景三:處理不同類型的響應(yīng)數(shù)據(jù)

后端可能返回JSON,也可能返回純文本或HTML片段。Fetch的Response對象提供了不同的方法來處理。

處理JSON (最常用):如上文所示,使用response.json()。

處理文本:例如后端返回一個簡單的成功消息或CSV數(shù)據(jù)。

fetch('/api/export')
  .then(response => response.text())
  .then(textData => {
    console.log(textData);
    // 處理文本數(shù)據(jù)...
  });

檢查響應(yīng)狀態(tài):在解析數(shù)據(jù)前,先檢查請求是否真正成功是個好習慣。

fetch('/api/some-data')
  .then(response => {
    if (!response.ok) { // 檢查HTTP狀態(tài)碼是否在200-299之間
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    return response.json(); // 狀態(tài)正常才解析JSON
  })
  .then(data => /* 處理數(shù)據(jù) */)
  .catch(error => /* 處理網(wǎng)絡(luò)錯誤或狀態(tài)碼錯誤 */);

6. 完整代碼參考與總結(jié)

下面是一個整合了登錄和新增項目的超簡易完整示例:

# app.py (Flask后端)
from flask import Flask, request, jsonify
from flask_cors import CORS

app = Flask(__name__)
CORS(app)
items = [] # 用一個簡易列表模擬數(shù)據(jù)庫

@app.route('/api/login', methods=['POST'])
def login():
    data = request.get_json()
    if data.get('user') == 'demo':
        return jsonify({'success': True, 'token': 'fake-jwt-token'})
    return jsonify({'success': False}), 401

@app.route('/api/items', methods=['GET', 'POST'])
def handle_items():
    if request.method == 'GET':
        return jsonify(items)
    else: # POST
        new_item = request.get_json()
        new_item['id'] = len(items) + 1
        items.append(new_item)
        return jsonify(new_item), 201

if __name__ == '__main__':
    app.run(debug=True)
<!-- index.html (部分前端) -->
<script>
// 登錄
fetch('/api/login', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({user: 'demo', pass: 'demo'})
}).then(r => r.json()).then(console.log);

// 新增項目并更新列表
fetch('/api/items', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({name: 'New Task'})
})
.then(r => r.json())
.then(newItem => {
    const list = document.getElementById('list');
    list.innerHTML += `<li>${newItem.id}: ${newItem.name}</li>`;
});
</script>

總結(jié)一下:Fetch + Flask 的組合,通過“請求-響應(yīng)-JSON”的模式,將前后端解耦,讓Web交互變得更加動態(tài)和高效。

關(guān)鍵在于:前端負責交互和UI更新,后端負責數(shù)據(jù)和邏輯,兩者通過清晰的API契約進行通信。

到此這篇關(guān)于Python Flask結(jié)合前端Fetch搞定表單提交和頁面刷新的文章就介紹到這了,更多相關(guān)Python Flask Fetch表單提交內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python中的eval函數(shù)使用實例

    python中的eval函數(shù)使用實例

    eval() 函數(shù)用來執(zhí)行一個字符串表達式,并返回表達式的值,這篇文章主要介紹了python中的eval函數(shù),需要的朋友可以參考下
    2022-11-11
  • 詳解APScheduler如何設(shè)置任務(wù)不并發(fā)

    詳解APScheduler如何設(shè)置任務(wù)不并發(fā)

    本文主要介紹了APScheduler如何設(shè)置任務(wù)不并發(fā),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Python中的面向?qū)ο缶幊淘斀?上)

    Python中的面向?qū)ο缶幊淘斀?上)

    這篇文章主要介紹了Python中的面向?qū)ο缶幊淘斀?上),本文講解了創(chuàng)建類、實例化類、類屬性、特殊方法內(nèi)建屬性、靜態(tài)變量屬性、實例變量屬性、方法屬性、靜態(tài)方法、類方法等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • 關(guān)于Pytorch MaxUnpool2d中size操作方式

    關(guān)于Pytorch MaxUnpool2d中size操作方式

    今天小編就為大家分享一篇關(guān)于Pytorch MaxUnpool2d中size操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python實現(xiàn)的簡單讀寫csv文件操作示例

    Python實現(xiàn)的簡單讀寫csv文件操作示例

    這篇文章主要介紹了Python實現(xiàn)的簡單讀寫csv文件操作,結(jié)合實例形式分析了Python使用csv模塊針對csv文件進行讀寫操作的相關(guān)實現(xiàn)技巧與注意事項,需要的朋友可以參考下
    2018-07-07
  • Python實現(xiàn)繪制雙柱狀圖并顯示數(shù)值功能示例

    Python實現(xiàn)繪制雙柱狀圖并顯示數(shù)值功能示例

    這篇文章主要介紹了Python實現(xiàn)繪制雙柱狀圖并顯示數(shù)值功能,涉及Python數(shù)值運算及基于matplotlib的圖形繪制相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Python搭建APNS蘋果推送通知推送服務(wù)的相關(guān)模塊使用指南

    Python搭建APNS蘋果推送通知推送服務(wù)的相關(guān)模塊使用指南

    這里總結(jié)了一份Python搭建蘋果推送通知推送服務(wù)的相關(guān)模塊使用指南,包括PyAPNs、基于twisted框架的pyapns以及apns-client三個模塊的介紹,需要的朋友可以參考下
    2016-06-06
  • python+opencv實現(xiàn)車道線檢測

    python+opencv實現(xiàn)車道線檢測

    這篇文章主要為大家詳細介紹了python+opencv實現(xiàn)車道線檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • Python代碼實現(xiàn)輕松編寫一個QQ AI機器人

    Python代碼實現(xiàn)輕松編寫一個QQ AI機器人

    這篇文章主要介紹了如何結(jié)合QQ 官方 Python SDK + 任意大模型 API,用30 行代碼搞定一個能在 QQ 群里聊天的 AI 機器人,不用裝任何桌面客戶端,一個 Python 腳本跑在服務(wù)器上就行,感興趣的小伙伴可以了解下
    2026-03-03
  • python的簡單web框架flask快速實現(xiàn)詳解

    python的簡單web框架flask快速實現(xiàn)詳解

    這篇文章主要為大家介紹了python的簡單web框架flask快速實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02

最新評論

珲春市| 德阳市| 襄垣县| 彰化市| 嘉义市| 比如县| 拉萨市| 怀来县| 乌鲁木齐县| 佛教| 阳城县| 启东市| 长乐市| 林芝县| 伊宁市| 老河口市| 临海市| 黄浦区| 奉新县| 兰溪市| 台安县| 松潘县| 偃师市| 阿拉善盟| 措美县| 平顶山市| 石景山区| 临夏市| 高要市| 涿州市| 蕲春县| 安塞县| 桐柏县| 墨竹工卡县| 永平县| 崇礼县| 聊城市| 千阳县| 萍乡市| 油尖旺区| 靖安县|