使用 route() 裝飾器來把函數綁定到 url,就可以定義不同的路徑執行的內容
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, Flask'
@app.route('/about/')
def hello():
return 'about Flask'
如果我們在路由的 url 設定中,尾巴加上斜線/
再造訪沒有斜線的網址的時候,例如 http://127.0.0.1:5000/about
會重新導向到有斜線的網址下:http://127.0.0.1:5000/about/
但若是網址帶上斜線造訪了尾部沒有設定斜線的網址:http://127.0.0.1:5000/hello/
這個時候會得到一個404 Not Found
如同所有路由一樣,我們可以定義路由網址接收參數
在剛剛的 hello.py 中加入以下內容
from markupsafe import escape
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return f'User {escape(username)}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return f'Post {post_id}'
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# show the subpath after /path/
return f'Subpath {escape(subpath)}'
首先要引用 escape 套件
為了防止使用者提交指令造成注入攻擊,大多數的網頁模版都會在渲染畫面前將符號轉譯
透過 escape() 我們可以手動進行這件事情
透過把 URL 的一部分標記為<variable_name>
就可以在 URL 中添加變數
標記的部分會作為關鍵字參數傳遞給函數
通過使用<converter:variable_name>
,可以選擇性的加上一個驗證,限制參數的型別
有以下幾種類型:
轉換器名稱 | 說明 |
---|---|
string | 預設值,接受不含斜槓的文字 |
int | 接受正整數 |
float | 接受正浮點數 |
path | 類似於 string 但是可以有斜槓 |
uuid | 接受 UUID 字串 |
如此應該就看得懂我們上面的路由規則在做什麼了!
另外要提的是那個f
到底是做什麼用的?其實就是我們在其他語言常用的%啦
學名叫做 Formatted String Literals,或是簡稱為 f-string
可以在官方文件中了解詳細使用方法:f-strings
基本上來說就是將大括號內的變數值塞進去,而不是印出變數名稱本身
而 f-strings 本身也具有格式設定的功能(format specifier)
這個選擇性的參數可以定義 f-strings 的回傳格式,如下方範例中將 pi 捨入到小數點後三位
>>> import math
>>> print(f'The value of pi is approximately {math.pi:.3f}')
The value of pi is approximately 3.142
現在我們除了 f-word 之外,還學會了 f-string 呢
上面我們已經知道怎麼建置基本的路由,但是都是寫死的
一但路由規則有所改變,那就必須對整個專案搜尋並修改路由
聽起來超可怕的!
在 flask 有個方式解決這個問題,就是透過url_for
這是一個 flask 內建的函數,可以直接從 flask 導入
from flask import url_for
url_for()
函數用於構建指定函數的 URL
把函數名稱作為第一個參數,可以接受任意個關鍵字參數
每個關鍵字參數對應 URL 中的變數,並添加到 URL 中作為查詢參數
底下就來示範這邊的使用方法
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
@app.route('/login-route')
def login():
return 'login'
@app.route('/user/<username>')
def profile(username):
return f'{username}\'s profile'
@app.route('/test/login')
def test_login():
return url_for('login')
@app.route('/test/profile')
def test_profile():
return url_for('profile', username='Jone Doe')
當我們造訪/test/login
頁面的時候,藉由url_for
方法
會找到前面定義的函數「login()」並且用它來建構路由
在這邊我們直接印出來就是定義好的 login 頁面的「網址路由」
不是重新到導向到該路由,也不是執行函數內容!
另一方面,當我們造訪/test/profile
頁面時,在 url_for 中加入參數
首先是找到「profile()」函數,並且將參數的內容填入指定函數的同名變數中
再說一次 url_for 是產生「網址路由」,不是執行函數,也不是重新導向!