iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0

在Flask網頁應用中,我們經常需要在不同路由之間進行重定向,或者在發生錯誤時向用戶顯示適當的錯誤信息。熟練掌握重定向和錯誤處理可以提高應用的健壯性,這篇教學將詳細講解這兩方面的內容。

重定向介紹

重定向指的是服務器端返回一個臨時的URL給客戶端,讓客戶端重新發起請求訪問新的URL。在Flask中可以使用redirect()函數實現。

  • 重定向在以下情況下非常有用:
    • 用戶登錄後重定向到用戶主頁
    • 提交表單後重定向到結果頁面
    • URL改變時重定向到新URL

如果不使用重定向,這些操作只會刷新當前頁面。重定向可以在服務器端進行路由切換。

重定向實現

Flask中的redirect()函數用來生成重定向回應。使用示例:

from flask import redirect

@app.route('/login')
def login():
    # 處理登錄邏輯
    return redirect('/home') # 重定向到主頁

當訪問/login路由時,會返回一個302響應,瀏覽器會自動再發一個請求訪問/home。

redirect()也可以使用URL網址:

return redirect('http://www.example.com')

這樣會重定向到example網站。

重定向傳遞數據

在重定向時,我們有時需要傳遞一些數據給重定向的頁面。這可以通過url_for()實現:

from flask import redirect, url_for

@app.route('/login')
def login():
    # 處理登錄邏輯
    # ...
    return redirect(url_for('home', name=user.name, id=user.id))

@app.route('/home')
def home():
    name = request.args.get('name') 
    id = request.args.get('id')
    ...

我們通過url_for()來構造重定向的URL,並傳遞了name和id參數。重定向的頁面可以通過request.args取到參數。

重定向回源地址

有時我們需要將用戶重定向回原本請求的源地址,比如用戶未登錄時重定向回登錄前的頁面。這時可以使用referrer參數:

from flask import redirect, request

@app.route('/profile')
def profile():
    if not current_user.is_authenticated:
        return redirect(request.referrer or '/') # 重定向到源地址或首页

這樣如果用戶訪問/profile沒有登錄,會自動跳轉回上一頁。

常見錯誤處理

當出現錯誤時,我們需要向用戶顯示適當的錯誤信息。常見錯誤包括:

錯誤代號 原因
400 Bad Request 客戶端請求包含語法錯誤
401 Unauthorized 未經授權的請求
403 Forbidden 服務器拒絕執行
404 Not Found 請求的資源不存在
500 Internal Server Error 服務器內部錯誤

我們可以使用abort()函數手動觸發錯誤:

from flask import abort

@app.route('/profile')
def profile():
    abort(401)

訪問此路由會返回401未授權錯誤。

針對不同錯誤,可以自定義錯誤處理程序:


@app.errorhandler(404)
def page_not_found(error):
    return render_template('errors/404.html'), 404

@app.errorhandler(500)
def internal_error(error):
    return render_template('errors/500.html'), 500

使用errorhandler裝飾器定義錯誤處理函數。返回模板或JSON給客戶端。

總結

熟練使用重定向和錯誤處理是建立健壯Flask應用的必備技能。redirect()url_for()可以實現自定義路由切換;使用abort()觸發錯誤並定製錯誤處理程序,讓應用更安全和智能。


上一篇
[Day 7] 在Flask中上傳檔案
下一篇
[Day 9]Flask Jinja2 pipe
系列文
從開始到放棄的Flask30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
clevens1008
iT邦新手 5 級 ‧ 2023-09-18 15:41:37

哈囉

我要留言

立即登入留言