添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如果我們在路由的 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 是產生「網址路由」,不是執行函數,也不是重新導向!