iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
Modern Web

Flask系列 第 4

Day 4 基本 flask 函式 (1)

前言

昨天提到了一些 flask 的例子,而今天會繼續深入討論他提供的一些函式,可以讓寫出來的網頁有更多的變化。

範例一

首先我們來看個例子,這個網頁裏面包含了數個路徑,我們一一來檢視。

from flask import Flask, redirect, url_for, abort

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def index():
    return "Index Page"
    
@app.route("/google")
def redirect_to_google():
    print("Route 1")
    return redirect("https://google.com")

@app.route("/google2")
def redirect_to_google_2():
    print("Route 2")
    return redirect(url_for("redirect_to_google"))

@app.route("/dont_see")
def dont_see():
    abort(403)


app.run(host="127.0.0.1", port=8080, debug=True)
  • 第一個路徑跟昨天的一樣,就是首頁。
  • 第二個路徑會幫我們重新導向 (redirect) 至 google,他使用了 redirect 這個函式,而我們需要先從 flask import 他。再來要注意的是,並不是單單 redirect(url) 就可以了,前面必須要加上 return
  • 第三個路徑一樣會幫我們重新導向至 google,但他的方法是先重新導向到第二個路徑,再由他重新導向至 google。其中用到了 url_for 這個函式,一樣要先 import。在 url_for() 填的參數是要導向的函式名稱,請注意是函式名稱 (字串),而非函式本身,也不是該路徑,如果要看完整對應表的話可以使用 app.url_map。他會找出該函式對應到的路徑,以此處為例,url_for("redirect_to_google") 會回傳 "/google",然後就會變成 return redirect("/google"),然後就會導向到剛剛的第二個路徑。
  • 最後一個路徑會直接回傳 403 Forbidden。這裡使用的是 abort 函式,一樣需要先 import。他很直接,就是會直接回傳指定的 指定的 HTTP status code,但必須要是一個錯誤的 code (404、418、500 等等)。這裡要注意的是,他不需要 return,但他跟 return 一樣,都會直接把後面的程式忽略。有了這個函式,我們可以更輕鬆的處理錯誤。如果不想要直接 abort 還想要有其他回傳東西的話,那可以改用 return "", 404,空字串的部分可以自由改動,flask 會回傳你指定的 HTML 並附加該 HTTP status code。

範例二

昨天有提到 return 只有某些型別可用,我舉的例子是 strResponse,這裡要說明的就是後者。這邊一樣先提供一個範例,它包含了兩個路徑。


from flask import Flask, make_response

app = Flask(__name__)

@app.route("/")
def set_cookie_page():
    response = make_response("meow1")
    response.headers["Content-Type"] = "text/html"
    response.set_cookie("user", "somebody")
    return response

@app.route("/del")
def del_cookie_page():
    response = make_response("meow2")
    response.delete_cookie("user")
    return response


app.run(host="127.0.0.1", port=8080, debug=True)
  • 第一個路徑中,我們先宣告了一個 response 變數,使用到了 make_response 函式,他也需要 import。這個函式的參數基本上就是在前面的例子中 return 的內容,如 redirect、一般的字串、或是未來會提到的 render_template 等等,這邊方便起見就隨便放一個字串。接下來我們可以設定該 response 的標頭,此處用常見的 Content-Type 作為範例,標頭是一個 dict,所以可以直接用此方式更改。再接著我們設定 cookie,使用的是 Response 物件的 set_cookie 函式,第一個參數是 cookie 名稱,第二個參數是 cookie 的值。最後我們傳回這個 response,可以打開開發人員工具來看看是否都有跑出正確的樣子。
  • 第二個路徑看起來就是第一個路徑的相反,他會刪除 cookie。要使用的是 Response 物件的 delete_cookie 函式,他只需要接 cookie 的名稱就可以刪除。這時候打開瀏覽器看 cookie 應該可以看到 user 欄位已經被清空。這邊可以注意的是,在網路上查有些人會直接 set_cookie("user", expire=0),這樣也是正確的,事實上,delete_cookie 這個函數的實作就是這樣做,只是把它包起來罷了。

這邊的 set_cookiedelete_cookie 都還有很多參數可以加,像是剛剛的 expire 等等,但就不再這邊多說了,有需要的人可以看一下他的原始碼,註解應該都蠻清楚的。

結語

今天看了一些進階的 flask 函式,有了這些函式可以讓我們能夠更細膩地設計網站。在本篇文章的內容都沒有深入討論該函式的其他用法,如果有興趣的人可以再看看文件及原始碼。

References

How do I set response headers in Flask?
How to set cookie in Python Flask?


上一篇
Day 3 基本範例
下一篇
Day 5 基本 flask 函式 (2)
系列文
Flask30

尚未有邦友留言

立即登入留言