iT邦幫忙

2021 iThome 鐵人賽

DAY 3
0
Modern Web

Flask系列 第 3

Day 3 基本範例

前言

今天會介紹一些 flask 的基本函式,所以我們還沒有正式開始寫專案。這些基本的函式十分常用,甚至有些會在幾乎每個有關 flask 的檔案中反覆出現,所以我選擇放在最前面介紹,未來如果有忘記的可以回來看一下。

簡單的範例

我們先從一個簡單的範例來看起。請注意如果要實作的話檔名務必使用 app.py,後面會解釋。

from flask import Flask

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def index():
    return "Index Page"

app.run(host="127.0.0.1", port=8080, debug=True)

接著只要在 command line 下指令:python app.py,flask 就會把這個網站建立起來,可以打開瀏覽器輸入 127.0.0.1:8080,沒有意外的話可以看到有一行 Index Page 寫在上面。
接下來我會逐行解釋這個簡單的網站:

  • 第一行我們引入 flask。
  • 第三行定義一個變數 app 作為這個 flask application 的實體。
  • 第五行使用裝飾器註冊一個路徑 /,這邊要注意的是 flask 要求每個路徑都要用 / 開頭,如 /meow/user 等等,meow 是不被允許的,會跳出 ValueError: urls must start with a leading slashmethods 是一個 list,裡面是這個路徑所允許的 HTTP method,這邊我用 GET 和 POST 為例。如果對裝飾器不熟悉可以閱讀此篇,在此處我不多加解釋其功用。
  • 第六行開始定義一個函式來處理通向 / 的 request,這個函式名稱隨意,但未來會用到。
  • 第七行回傳一個字串 Index Page,也就是剛剛在瀏覽器看到的東西。它的目的就是回傳 HTML 或是 response (後面會提到),未來還會加入更多複雜的方式來 render 網頁。
  • 第九行使用 app.run() 讓他跑,並用 hostport 來指定要跑在哪裡,如果是在有公開 IP 的伺服器上可以直接把 host 設為該 IP,最後的 debug=True 表示現在是開發模式,flask 會打開一些 debug 的工具,等等會解釋。但未來基本上不會使用此方法,所以不會介紹太多。

要把這個網站跑起來還有第二個方法,可以在命令列輸入 flask run,這個指令是跟著 pip install flask 一起安裝的。

但要注意的是,使用這個指令會自動把程式碼裡面的 app.run() 忽略,也就是說,他會自動忽略上面的 hostport,在未指定的情況下,預設 host=127.0.0.1port=5000。如果要指定的話,需要傳入參數,如 flask run --host 127.0.0.1 --port 8080,這樣會達到和上面相同的效果。

此外,理論上我們需要設定 FLASK_APP 這個環境變數,它的作用是告訴 flask 你的 flask application 在哪裡。當沒有設定的時候,他會自動去尋找 app.pywsgi.py 或是裡面有 create_appmake_app 函式的模組 (後面會提到)。也就是說,如果這時候檔名不是 app.py,他剛剛就不會順利執行了。

最後還有一個要注意的點,在執行的時候 (兩種方法都是) 畫面應該會跑出一行紅字:WARNING: This is a development server. Do not use it in a production deployment.,這表示這個執行方法並不適合用於 production。但我們現在只是用於開發,所以可以設定 FLASK_ENV=DEVELOPMENT 這個環境變數,來告訴 flask 現在使用的環境為開發環境。在更改為開發環境的同時,flask 會打開一些 debug 相關的功能:

  • debugger,讓你在程式碼錯誤的時候直接在網頁上顯示 error traceback,而非黑底白字的 500 Internal Server Error
  • debug console,可以在瀏覽器上輸入 127.0.0.1:8080/console,flask 有一個內建的 interactive debugger 可以讓你跟系統互動。
  • reloader,在修改 flask 有關的檔案時,flask 會自動重啟並套用剛剛的更動,可以免去一直重開的麻煩。

另一個範例

稍微修改一下剛剛的程式碼,加入一些新東西。

from flask import Flask

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def index():
    return "Index Page"
    
@app.route("/dynamic/<int:id>", methods=["GET"])
def dynamic_url_page(id):
    return str(id)

app.run(host="127.0.0.1", port=8080, debug=True)

在這個範例裡,我們新增了第二個路徑 /dynamic/<int:id>,前面的 /dynamic 跟上面的 / 是接近的,新的東西在後面的 /<int:id>

他是 flask 提供的「動態路徑」功能,冒號前面的 int 表示他的型別,後面的 id 則是變數名稱,而這個變數需要在下方處理 request 的函式中作為一個參數。這時候存取 /dynamic/1,flask 就會傳回 1,但如果存取 /dynamic/meow,那就會傳回 404 Not Found,因為 meow 並非一個整數,並沒有符合這條路徑規則。

我們也可以把規則寫成 /dynamic/@<int:id>,這樣一來,存取 /dynamic/@1 就會傳回 1。

值得一提的是,如果在回傳的時候沒有先把 id 轉型成 str,那 flask 會有錯誤:TypeError: The view function did not return a valid response. The return type must be a string, dict, tuple, Response instance, or WSGI callable, but it was a int.,這表示你回傳的不是正確的型別,合法的型別只有 strResponse (未來會提到) 等等,其餘可以參考附錄一。

結語

今天看了兩個簡單的 flask 範例,基本上這樣就足以建出一個簡單的小網站,但未來我們還會繼續探討其他函式。

References

Flask: return value of view function
Command Line Interface


上一篇
Day 2 基本工具及套件
下一篇
Day 4 基本 flask 函式 (1)
系列文
Flask30

尚未有邦友留言

立即登入留言