Python Flask 概念與實作(一) - Flask model運用

前言

在Flask中有需多實用的model,在之後的實作我們也會使用到,這小節會介紹許多model,若之後有使用到其他的model我盡量也會補充進來。


目前 Python Flask 概念與實作 大致規劃為

  1. 佈置環境
  2. Flask model運用(一)
  3. Web server概念(二)
  4. 專案檔案分佈(三)
  5. 連接資料庫(四)
  6. 渲染模板(五)
  7. 登入功能(六)
  8. Blog功能(七)

在開發過程中,Test(測試)其實也很重要,但礙於缺乏經驗,若之後有望的話再補上(專案打包、網站優化等等亦同)


Flask model

在上一節佈置環境當中,我們建立一個flask-tutorial專案,在這節中我們會沿用這些檔案

Debug

礙於每次改程式時都要先重啟server實在太麻煩,因此我們在開發時會使用debug模式,當程式碼更改時會自動重新運行!

1
flask --app helloFlask run --debug

Tips
若是將run寫在檔內,也可開啟debug模式

1
2
3
4
5
6
7
8
9
10
11
# helloFlask.py
from flask import Flask

app = ...
# 省略

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

# 若想指定port也在"run"中設定
# app.run(debug=True, prot=4500)

route

上一節所定義的route中,也可以輸入變數,其中變數使用<>包圍起來,且預設型態是sting

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from flask import Flask

app = Flask(__name__)

@app.route("/hello")
def hello():
return "Hello, Flask"

@app.route("/user/<user_name>")
def user(user_name):
s = "Hello, " + user_name
# return僅能返回string
return s

@app.route("/page/<int:num>")
def page(num):
s = "This is " + str(num) + " page."
return s
string 不包含"/"的字串
int 整數
float 浮點數
path 可包含"/"的字串

url_for & redirect

輸入已定義的函數名稱,url_for可以返回對映整理好的URL。而redirect會重新導向輸入的URL。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 引入 url_for, redirect
from flask import Flask, url_for, redirect

app = Flask(__name__)

@app.route("/home")
def home():
return "This is Home page."

# 在瀏覽器中輸入http://127.0.0.1:5000/時,會自動導向/home
@app.route("/")
def index():
return redirect(url_for("home"))

render_teplate

1
2
3
4
5
6
7
from flask import Flask

app = Flask(__name__)

@app.route("/home")
def home(name):
return "<h1>This is Home page.</h1>"

在上述這個例子,我們將This is Home page.寫在helloFlask.py當中,但隨著我們專案越來越大,將所有程式碼寫在同一個檔案中會造成難以閱讀、維護的問題。因此,通常我們會將.html存放在/templates以利Flask存取。而render_teplate可以引入這些在/templates中的.html

  1. /flask-tutorial中新增/templates資料夾
  2. /templates中新增index.html
    1
    2
    3
    <h1>This is Home page.</h1>
    <!-- 這裡使用Jinja2語法,之後會再做介紹 -->
    Welcome, {{name}}
  3. 修改helloFlask.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # helloFlask.py
    # 引入 render_template
    from flask import Flask, render_template

    app = Flask(__name__)

    @app.route("/home/<name>")
    def home(name):
    return render_template("index.html", name=name)

目前專案結構會是這樣

TreeFlaskTutorial

在瀏覽器中輸入http://127.0.0.1:5000/home/MC時會自動導入變數MC

WelcomeMC

request

Internet Protocol Suite(網路協定)中有說到Client有許多種型態的request,在route中也可以設定收到不同的request回覆不同的動作

  1. 修改index.html
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!-- index.html -->
    <h1>This is Home page.</h1>
    Welcome, {{name}}
    <!-- 新增form表格, request方式為"post" -->
    <form method="post">
    <!-- 設定email變數名稱為"user_email" -->
    email: <input type="email" name="user_email">
    <button type="submit">submit</button>
    </form>
    HomePage
  2. 修改helloFlask.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # helloFlask.py
    # 引入 render_template, request
    from flask import Flask, render_template, request

    app = Flask(__name__)

    # route可決定指定request種類
    @app.route("/home/<name>", methods=["GET", "POST"])
    def home(name):
    if request.method == "POST":
    # 返回client傳送的email
    return "Flask server requested email: " + request.values["user_email"]
    return render_template("index.html", name=name)
    HomePageRequest

session

暫時略過,之後補充😅

結論

  • 開啟Debug模式,方便隨時更改code
  • route讓client在URL中也能輸入參數
  • url_for可找到已定義的函數名稱,並整理成URL格式
  • redirect會重新導向輸入的URL
  • render_teplate可套用/templates中的.html
  • request可處理client的請求
  • session待更新❗️
  • Jinja2語法待更新❗️