Python Flask結(jié)合前端Fetch搞定表單提交和頁面刷新
亮點包括: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': '用戶名或密碼錯誤'}), 4014. 場景二:動態(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)文章
詳解APScheduler如何設(shè)置任務(wù)不并發(fā)
本文主要介紹了APScheduler如何設(shè)置任務(wù)不并發(fā),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07
關(guān)于Pytorch MaxUnpool2d中size操作方式
今天小編就為大家分享一篇關(guān)于Pytorch MaxUnpool2d中size操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python實現(xiàn)繪制雙柱狀圖并顯示數(shù)值功能示例
這篇文章主要介紹了Python實現(xiàn)繪制雙柱狀圖并顯示數(shù)值功能,涉及Python數(shù)值運算及基于matplotlib的圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
Python搭建APNS蘋果推送通知推送服務(wù)的相關(guān)模塊使用指南
這里總結(jié)了一份Python搭建蘋果推送通知推送服務(wù)的相關(guān)模塊使用指南,包括PyAPNs、基于twisted框架的pyapns以及apns-client三個模塊的介紹,需要的朋友可以參考下2016-06-06
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)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02

