如果我們在路由的 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>
,可以選擇性的加上一個驗證,限制參數的型別
有以下幾種類型:
轉換器名稱
另外要提的是那個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 是產生「網址路由」,不是執行函數,也不是重新導向!