博客 / 詳情

返回

Flask核心技能:從零上手視圖函數

想快速上手Flask,卻被視圖函數繞暈了頭? 要知道,超過80%的Flask核心邏輯都編寫在視圖函數裏,掌握它,你就拿下了Flask開發的半壁江山!

本文為你清晰拆解Flask視圖函數的方方面面:從基本定義、請求數據獲取、響應返回到錯誤處理與狀態碼設置。你將學到如何讓視圖函數既健壯又好用,並附上一個可直接運行的完整示例。

🚀 目錄一覽- 視圖函數是什麼?

  • 如何定義一個視圖函數?
  • 如何處理請求數據?(GET/POST)
  • 如何返回多樣化的響應?
  • 如何進行錯誤處理?
  • 如何理解和使用狀態碼?
  • 完整代碼示例

🤔 視圖函數是什麼?

簡單説,視圖函數就是你為某個特定的URL(路由)編寫的處理函數。當用户訪問這個URL時,Flask就會調用這個函數,並將函數的返回值作為響應發送給用户的瀏覽器。

它是連接請求(Request)和響應(Response)的核心橋樑,是你實現業務邏輯的主要舞台。

✏️ 如何定義一個視圖函數?

定義視圖函數只需兩步:

1.使用 @app.route 裝飾器綁定URL;

2.編寫一個Python函數。

from flask import Flask
app = Flask(__name__)

# 1. 綁定路由 ‘/‘
@app.route('/')
def index():
# 2. 編寫處理邏輯
return '歡迎來到首頁!'

# 帶變量的路由
@app.route('/user/')
def show_user_profile(username): # 變量名必須與路由中一致
return f'用户:{username}'

裝飾器是關鍵,它告訴Flask哪個URL觸發哪個函數。

📥 如何處理請求數據?(GET/POST)

Web應用的核心是與用户輸入互動。Flask的 request 對象封裝了所有請求數據。

from flask import request

# 處理GET請求的查詢參數:/search?q=keyword
@app.route('/search')
def search():
    keyword = request.args.get('q', '') # 安全獲取參數,避免KeyError
    return f'搜索關鍵詞:{keyword}'

# 處理POST請求的表單數據(如登錄)
@app.route('/login', methods=['POST']) # 必須指明methods
def login():
    username = request.form.get('username')
    password = request.form.get('password')
    # ... 驗證邏輯 ...
    return f'用户 {username} 嘗試登錄'

# 處理JSON格式的請求體(常見於API)
@app.route('/api/data', methods=['POST'])
def receive_data():
    json_data = request.get_json() # 直接解析為字典/列表
    return {'received': json_data}, 200

記住:request.args 用於GET查詢參數,request.form 用於POST表單數據,request.get_json() 用於JSON數據。

📤 如何返回多樣化的響應?

視圖函數可以返回多種類型的響應,不僅僅是字符串。

from flask import render_template, jsonify, redirect, url_for, make_response

# 1. 返回字符串(默認)
@app.route('/hello')
def hello():
return 'Hello, World!'

# 2. 返回JSON(構建API必備)
@app.route('/user/')
def get_user(user_id):
user_data = {'id': user_id, 'name': '張三'}
return jsonify(user_data) # 自動設置Content-Type為application/json

# 3. 返回HTML模板
@app.route('/home')
def home():
return render_template('home.html', title='主頁')

# 4. 重定向
@app.route('/old')
def old_endpoint():
return redirect(url_for('home')) # 重定向到‘home’函數對應的URL

# 5. 自定義響應對象(設置Header、Cookie等)
@app.route('/custom')
def custom_response():
resp = make_response(render_template('index.html'))
resp.set_cookie('token', 'abc123')
resp.headers['X-Custom-Header'] = 'Value'
return resp

使用 jsonify() 返回JSON,render_template() 返回渲染的HTML,redirect() 進行頁面跳轉,這是最常用的三種方式。

⚠️ 如何進行錯誤處理?

優雅地處理錯誤能極大提升用户體驗。Flask允許你為特定錯誤碼定製頁面或響應。

from flask import render_template

# 1. 使用裝飾器註冊錯誤處理器
@app.errorhandler(404)
def page_not_found(error):
    # 可以返回模板,也可以返回JSON(針對API)
    return render_template('404.html'), 404 # 必須返回錯誤碼

@app.errorhandler(500)
def internal_server_error(error):
    return '服務器內部錯誤,請稍後再試!', 500

# 2. 在視圖函數中手動觸發錯誤
@app.route('/admin')
def admin():
    # 假設用户未登錄,則返回403禁止訪問
    # 可以使用 abort() 函數立即中斷並返回錯誤響應
    from flask import abort
    abort(403)

@app.errorhandler 是自定義錯誤頁面的標準方法,別忘了在返回值裏指明狀態碼。

🔢 如何理解和使用狀態碼?

HTTP狀態碼是服務器對請求的“迴應語”。在Flask中,你可以輕鬆設置它。

常見狀態碼:

  • 200 OK:請求成功(Flask返回字符串或模板時默認)
  • 301/302:重定向(redirect() 默認返回302)
  • 400 Bad Request:客户端請求錯誤
  • 404 Not Found:資源不存在
  • 500 Internal Server Error:服務器內部錯誤

設置方法很簡單,在返回值後加上數字即可:

@app.route('/created')
def created():
    # 創建成功,返回201 Created狀態碼
    return '資源已創建', 201

@app.route('/no_content')
def no_content():
    # 處理成功,但無內容返回,返回204 No Content
    return '', 204

🧪 完整代碼示例

將以上知識點融合,下面是一個功能較全的Flask應用示例:

from flask import Flask, request, jsonify, render_template_string, abort

app = Flask(__name__)

# 首頁,返回字符串
@app.route('/')
def index():
    return '歡迎!試試訪問 /hello?name=你的名字 或向 /submit 發送POST請求。'

# 處理GET請求和查詢參數
@app.route('/hello')
def hello():
    name = request.args.get('name', '陌生人')
    return f'你好,{name}!'

# 處理POST請求和表單數據
@app.route('/submit', methods=['POST'])
def submit():
    data = request.form.get('data')
    if not data:
        return '未接收到數據', 400 # 客户端錯誤
    return jsonify({'status': 'success', 'received_data': data})

# 帶變量路由和模擬API
@app.route('/api/users/')
def get_user_api(user_id):
    if user_id > 100:
        abort(404, description="用户不存在") # 觸發404錯誤
    return jsonify({'user_id': user_id, 'name': '測試用户'})

# 自定義404錯誤處理
@app.errorhandler(404)
def not_found(error):
    # 返回一個簡單的HTML錯誤頁面
    html_template = '''
    <h1>頁面走丟啦!</h1>
    <p>{{ error_description }}</p>
    '''
    return render_template_string(html_template, error_description=error.description), 404

if __name__ == '__main__':
    app.run(debug=True)

複製以上代碼到 app.py,運行 python app.py,即可在本地體驗所有功能。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.