Flask請求對象:獲取用戶輸入與參數

在Flask中,當用戶訪問我們的應用時,會發送各種請求(比如GET、POST等),而我們需要獲取用戶在請求中傳遞的參數和數據,這時候就需要用到請求對象。Flask通過request對象幫我們封裝了這些信息,讓我們可以輕鬆獲取用戶輸入的內容。

1. 導入請求對象

首先,我們需要從Flask中導入request對象。在你的Flask應用文件(比如app.py)中,開頭部分通常會有:

from flask import Flask, request

app = Flask(__name__)

這樣我們就可以在路由函數中使用request來處理請求數據了。

2. 獲取查詢字符串參數(URL參數)

當用戶通過URL的查詢字符串傳遞參數時(比如/hello?name=Alice&age=18),這些參數會被放在查詢字符串中,Flask通過request.args來獲取。

示例:獲取GET請求的查詢參數

@app.route('/hello')
def hello():
    # 獲取查詢參數中的name,默認值爲"Guest"
    name = request.args.get('name', 'Guest')
    # 獲取年齡,指定類型爲整數,默認值爲0
    age = request.args.get('age', 0, type=int)
    return f"Hello, {name}! You are {age} years old."

此時,當用戶訪問/hello?name=Bob&age=20時,頁面會返回Hello, Bob! You are 20 years old.

  • request.args是一個類似字典的對象,存儲了所有查詢參數。
  • 使用get('參數名')獲取參數,第二個參數是默認值(參數不存在時返回)。
  • 通過type=int可以指定參數類型(如數字),如果參數不存在或類型錯誤,會返回默認值。

3. 獲取表單數據(POST請求)

當用戶通過HTML表單(如登錄表單)提交數據時,通常使用POST請求。這時候需要在路由中指定methods=['POST'],並通過request.form獲取表單數據。

示例:處理POST表單提交

@app.route('/login', methods=['POST'])
def login():
    # 獲取表單中的用戶名和密碼
    username = request.form.get('username')
    password = request.form.get('password')
    if username and password:
        return f"Login successful! Welcome, {username}."
    else:
        return "Please fill in all fields.", 400  # 返回400錯誤碼

此時,前端需要以application/x-www-form-urlencoded格式提交數據(這是HTML表單的默認格式)。比如用Postman模擬POST請求,在Body中選擇form-datax-www-form-urlencoded,填寫usernamepassword參數。

4. 獲取JSON數據(POST請求)

如果用戶通過POST請求發送JSON格式的數據(比如前端用JavaScript的fetch發送JSON),需要使用request.get_json()來獲取。

示例:處理JSON數據

@app.route('/add_user', methods=['POST'])
def add_user():
    # 檢查是否是JSON請求
    if not request.is_json:
        return "Request must be JSON", 415  # 415表示不支持的媒體類型
    # 獲取JSON數據
    data = request.get_json()
    username = data.get('username')
    age = data.get('age')
    if username and age:
        return f"User {username} added. Age: {age}"
    else:
        return "Missing username or age", 400

此時,前端發送的JSON應該類似:

{
    "username": "Charlie",
    "age": 22
}
  • request.is_json用於判斷請求是否是JSON格式。
  • request.get_json()會返回解析後的Python字典,如果請求不是JSON,會返回None
  • 可以設置request.get_json(force=True)強制解析,即使Content-Type不是application/json(但不推薦,可能導致錯誤)。

5. 總結關鍵點

  • 查詢字符串(GET參數):用request.args,對應URL中的?後參數。
  • 表單數據(POST):用request.form,注意路由需指定methods=['POST']
  • JSON數據(POST):用request.get_json(),需先判斷是否是JSON(request.is_json)。
  • 使用get()方法時,儘量提供默認值,避免None導致錯誤。
  • request對象還有其他屬性(如request.method獲取請求方法,request.headers獲取請求頭),但獲取參數時常用以上方法。

小練習

嘗試修改上面的示例,比如:
1. 寫一個路由,獲取URL中的id參數並返回其平方(注意類型轉換)。
2. 寫一個POST路由,接收JSON數據,返回數據的長度。

通過這些練習,你就能更熟練地處理用戶輸入和參數啦!

小夜