Flask API開發:JSON數據返回與狀態碼設置

在Web開發中,尤其是前後端分離的架構裏,API(應用程序接口)是數據交換的核心。Flask作爲輕量級Python Web框架,憑藉其簡潔的特性,常被用於快速開發API。本文將重點講解如何在Flask中返回JSON格式數據,並正確設置HTTP狀態碼,幫助初學者理解API開發的基礎要點。

一、爲什麼需要返回JSON?

當我們開發API時,前後端之間需要交換結構化數據。JSON(JavaScript Object Notation)是最常用的數據格式,它輕量、易解析,且與大多數編程語言兼容。例如,前端可以輕鬆將JSON數據轉換爲JavaScript對象,後端也能通過JSON解析器處理數據。

二、在Flask中返回JSON數據

Flask提供了專門的工具來處理JSON數據——jsonify函數。它不僅能將Python字典/列表轉換爲JSON格式,還會自動設置響應頭Content-Type: application/json,確保前端能正確識別數據類型。

1. 基本使用示例

首先安裝Flask(若未安裝):

pip install flask

創建一個簡單的Flask應用,返回JSON數據:

from flask import Flask, jsonify

app = Flask(__name__)

# 定義路由,返回JSON數據
@app.route('/greet')
def greet():
    # 構造Python字典(鍵值對)
    response_data = {
        "message": "Hello, Flask API!",
        "status": "success",
        "code": 200
    }
    # 使用jsonify返回JSON
    return jsonify(response_data)

運行測試:啓動Flask應用,訪問http://localhost:5000/greet,你會看到類似以下的JSON響應:

{
  "message": "Hello, Flask API!",
  "status": "success",
  "code": 200
}

2. 直接返回字典的誤區

注意:如果直接返回Python字典(而非jsonify),Flask會自動處理爲JSON嗎?
答案是:可以,但不推薦。例如:

@app.route('/test')
def test():
    data = {"name": "Alice", "age": 20}
    return data  # Flask會自動轉爲JSON,但可能依賴版本或場景

雖然這種方式在多數情況下可行,但jsonify更明確,且能處理非字典類型(如列表、元組),因此建議始終使用jsonify

三、HTTP狀態碼的作用

HTTP狀態碼是服務器返回給客戶端的“結果報告”,幫助前端(或調用方)判斷請求是否成功。例如:
- 200 OK:請求成功(最常用);
- 201 Created:資源創建成功(常用於POST請求);
- 400 Bad Request:請求參數錯誤;
- 404 Not Found:資源不存在;
- 500 Internal Server Error:服務器內部錯誤。

四、在Flask中設置狀態碼

Flask支持兩種方式設置狀態碼:返回元組使用make_response構造響應對象

1. 返回元組(數據 + 狀態碼)

在視圖函數中,直接返回元組(響應數據, 狀態碼)即可。例如:

@app.route('/user/<int:user_id>')
def get_user(user_id):
    # 模擬數據(實際中可能從數據庫獲取)
    user = {"id": user_id, "name": "Bob"}
    # 返回JSON數據 + 狀態碼200(成功)
    return jsonify(user), 200

@app.route('/user/<int:user_id>')
def get_user(user_id):
    if user_id == 0:
        # 返回錯誤信息 + 狀態碼404(資源不存在)
        return jsonify({"error": "User not found"}), 404
    user = {"id": user_id, "name": "Bob"}
    return jsonify(user), 200

2. 使用make_response構造響應對象

對於需要更復雜設置(如自定義響應頭)的場景,可先用make_response創建響應對象,再設置狀態碼:

from flask import make_response

@app.route('/login')
def login():
    # 模擬登錄失敗
    response = jsonify({"error": "Invalid password"})
    response.status_code = 401  # 設置狀態碼爲“未授權”
    return response

五、常見場景示例

以下是API開發中最常用的場景及對應的JSON返回和狀態碼設置:

場景1:成功返回數據(GET請求)

需求:獲取產品列表
代碼

from flask import Flask, jsonify

app = Flask(__name__)

# 模擬產品數據
products = [
    {"id": 1, "name": "Laptop", "price": 999},
    {"id": 2, "name": "Phone", "price": 499}
]

@app.route('/products', methods=['GET'])
def get_products():
    return jsonify({
        "status": "success",
        "data": products
    }), 200  # 200 OK(默認狀態碼,可省略)

場景2:資源創建成功(POST請求)

需求:創建新用戶
代碼

from flask import Flask, jsonify, request  # 導入request處理請求數據

app = Flask(__name__)
users = {}  # 模擬數據庫

@app.route('/users', methods=['POST'])
def create_user():
    # 獲取前端提交的JSON數據
    new_user = request.get_json()
    if not new_user or 'name' not in new_user:
        # 參數錯誤,返回400
        return jsonify({"error": "Name is required"}), 400

    user_id = len(users) + 1
    users[user_id] = new_user
    # 返回新創建的用戶數據 + 201狀態碼(Created)
    return jsonify({
        "status": "success",
        "data": users[user_id],
        "user_id": user_id
    }), 201

場景3:資源不存在(404錯誤)

需求:查詢不存在的用戶
代碼

@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    if user_id not in users:
        # 資源不存在,返回404
        return jsonify({"error": f"User {user_id} not found"}), 404
    return jsonify(users[user_id]), 200

場景4:服務器內部錯誤(500錯誤)

需求:模擬服務器異常
代碼

@app.route('/error')
def trigger_error():
    try:
        # 故意製造錯誤(如除零)
        1 / 0
    except:
        # 返回錯誤信息 + 500狀態碼
        return jsonify({"error": "Server internal error"}), 500

六、總結

  • 返回JSON:始終使用jsonify函數,確保數據格式正確且前端能解析。
  • 狀態碼設置:通過元組(jsonify(data), status_code)make_response設置,明確請求結果(成功/失敗)。
  • 常見狀態碼200(成功)、201(創建成功)、400(參數錯誤)、404(資源不存在)、500(服務器錯誤)。

掌握這些基礎後,你就能開發出規範、清晰的Flask API,實現前後端數據的順暢交互。

小夜