當我們使用Flask開發Web應用時,經常需要根據不同場景返回不同類型的響應。比如,給前端API返回JSON數據,或者在用戶訪問舊頁面時自動跳轉到新頁面。這時候就需要用到Flask的響應對象相關功能:jsonify和redirect。
一、返回JSON數據¶
在Web開發中,API接口通常需要返回JSON格式的數據。如果直接返回Python字典,Flask會將其當作普通字符串處理,導致前端無法正確解析。這時需要使用jsonify函數。
爲什麼用jsonify?¶
- 自動設置響應頭:
jsonify會自動設置Content-Type: application/json,告訴前端這是JSON格式數據。 - 處理複雜數據:支持Python字典、列表等數據結構,自動轉換爲標準JSON格式。
示例代碼¶
from flask import Flask, jsonify
app = Flask(__name__)
# 返回JSON數據的接口
@app.route('/api/info')
def get_info():
# 定義Python字典(或列表)
data = {
"name": "Flask",
"version": "2.3.3",
"features": ["輕量", "靈活", "易擴展"]
}
# 使用jsonify返回JSON響應
return jsonify(data)
錯誤示例¶
如果直接返回字典,Flask會返回錯誤的格式:
@app.route('/api/info')
def get_info():
data = {"name": "Flask"}
return data # 錯誤!返回的是字符串格式,前端無法解析JSON
二、重定向(Redirect)¶
當需要讓用戶訪問一個新的URL(比如舊頁面遷移、表單提交後跳轉)時,需要使用redirect函數生成重定向響應。
爲什麼用redirect?¶
- 告訴瀏覽器跳轉:通過HTTP狀態碼(默認302)告訴瀏覽器“該URL已移動,需訪問新地址”。
- 避免重複提交:比如用戶提交表單後,防止重複提交,重定向到結果頁。
示例代碼¶
from flask import Flask, redirect, url_for
app = Flask(__name__)
# 舊頁面,重定向到新頁面
@app.route('/old-page')
def old_page():
# 使用url_for根據視圖函數名獲取新頁面的URL(更靈活,避免硬編碼)
return redirect(url_for('new_page'), code=302) # code=302爲臨時重定向
# 新頁面
@app.route('/new-page')
def new_page():
return "歡迎來到新頁面!"
狀態碼說明¶
- 302(臨時重定向):搜索引擎可能不認爲原URL永久失效,常用於臨時跳轉(如活動頁跳轉)。
- 301(永久重定向):搜索引擎會記住URL變更,常用於域名遷移等永久場景。
示例:return redirect(url_for('new_page'), code=301)
三、綜合示例:表單提交後跳轉並返回JSON¶
from flask import Flask, jsonify, redirect, url_for, request
app = Flask(__name__)
# 1. 模擬用戶登錄表單
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# 簡單驗證(實際需結合數據庫)
if username == "admin" and password == "123456":
# 登錄成功,重定向到首頁並返回用戶信息
return redirect(url_for('home'))
else:
return "用戶名或密碼錯誤!"
# GET請求:渲染登錄表單
return '''
<form method="post">
<input type="text" name="username" placeholder="用戶名"><br>
<input type="password" name="password" placeholder="密碼"><br>
<button type="submit">登錄</button>
</form>
'''
# 2. 登錄成功後返回JSON數據
@app.route('/home')
def home():
user_info = {
"username": "admin",
"role": "管理員",
"status": "已登錄"
}
return jsonify(user_info) # 返回用戶信息JSON
if __name__ == '__main__':
app.run(debug=True)
總結¶
- 返回JSON:用
jsonify,自動處理格式和響應頭,避免前端解析錯誤。 - 重定向:用
redirect,結合url_for避免硬編碼URL,根據場景選擇301/302狀態碼。 - 核心區別:
jsonify是“返回數據”,redirect是“跳轉地址”,分別對應不同業務場景。
通過這兩個工具,Flask能靈活處理API數據返回和頁面跳轉,滿足大部分Web開發需求。