Flask響應對象:返回JSON與重定向

當我們使用Flask開發Web應用時,經常需要根據不同場景返回不同類型的響應。比如,給前端API返回JSON數據,或者在用戶訪問舊頁面時自動跳轉到新頁面。這時候就需要用到Flask的響應對象相關功能:jsonifyredirect

一、返回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開發需求。

小夜