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

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

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

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

你將學(xué)到:

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

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

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

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

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

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

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

pip install flask flask-cors

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

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

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

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

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

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

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

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

    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 {
            // 登錄失敗,動(dòng)態(tài)更新頁面上的錯(cuò)誤提示元素
            document.getElementById('error-msg').textContent = result.message;
        }
    })
    .catch(error => console.error('Error:', error));
});

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

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

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

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

// 假設(shè)有一個(gè)保存按鈕,用于提交新增或修改的數(shù)據(jù)
saveButton.addEventListener('click', () => {
    const itemData = { title: '新項(xiàng)目', 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)鍵步驟:請求成功后,動(dòng)態(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()

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

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

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

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ò)錯(cuò)誤或狀態(tài)碼錯(cuò)誤 */);

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

下面是一個(gè)整合了登錄和新增項(xiàng)目的超簡易完整示例:

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

app = Flask(__name__)
CORS(app)
items = [] # 用一個(gè)簡易列表模擬數(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);

// 新增項(xiàng)目并更新列表
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”的模式,將前后端解耦,讓W(xué)eb交互變得更加動(dòng)態(tài)和高效。

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

    這篇文章主要介紹了Python實(shí)現(xiàn)繪制雙柱狀圖并顯示數(shù)值功能,涉及Python數(shù)值運(yùn)算及基于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三個(gè)模塊的介紹,需要的朋友可以參考下
    2016-06-06
  • python+opencv實(shí)現(xiàn)車道線檢測

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

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

    Python代碼實(shí)現(xiàn)輕松編寫一個(gè)QQ AI機(jī)器人

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

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

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

最新評論

永康市| 逊克县| 乳山市| 仪陇县| 麻栗坡县| 红原县| 延川县| 岚皋县| 藁城市| 绵阳市| 四会市| 黔东| 格尔木市| 绵竹市| 龙游县| 财经| 信宜市| 文山县| 建瓯市| 建水县| 九龙县| 叙永县| 深泽县| 宁南县| 西畴县| 彩票| 申扎县| 申扎县| 固安县| 西畴县| 贵阳市| 灌南县| 苏尼特左旗| 锡林浩特市| 通化县| 荣昌县| 长治市| 邹平县| 北安市| 中方县| 香格里拉县|