在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,實現前後端數據的順暢交互。