iT邦幫忙

2021 iThome 鐵人賽

DAY 4
1

基本路由

使用 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 是產生「網址路由」,不是執行函數,也不是重新導向!


上一篇
[03] [Flask 快速上手筆記] 02. 第一個 App
下一篇
[05] [Flask 快速上手筆記] 04. HTTP 方法x靜態文件x渲染模板
系列文
都是 P 開頭的程式語言,你是在 py 啥啦30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言