現代 Web 應用的 URL 十分優雅,易於人們辨識記憶,這一點對於那些面向使用低速網絡連接移動設備訪問的應用特別有用。如果可以不訪問索引頁,而是直接訪問想要的那個頁面,他們多半會笑逐顏開而再度光顧。
如上所見, route() 裝飾器把一個函數綁定到對應的 URL 上。
這里是一些基本的例子:
@app.route('/') def index(): return 'Index Page' @app.route('/hello') def hello(): return 'Hello World'
但是,不僅如此!你可以構造含有動態部分的 URL,也可以在一個函數上附着多個規則。
變量規則
要給 URL 添加變量部分,你可以把這些特殊的字段標記為 <variable_name> , 這個部分將會作為命名參數傳遞到你的函數。規則可以用 <converter:variable_name> 指定一個可選的轉換器。這里有一些不錯的例子:
@app.route('/user/<username>') def show_user_profile(username): # show the user profile for that user return 'User %s' % 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 'Post %d' % post_id
轉換器有下面幾種:
int | 接受整數 |
float | 同 int ,但是接受浮點數 |
path | 和默認的相似,但也接受斜線 |
唯一 URL / 重定向行為
Flask 的 URL 規則基於 Werkzeug 的路由模塊。這個模塊背后的思想是基於 Apache 以及更早的 HTTP 服務器主張的先例,保證優雅且唯一的 URL。
以這兩個規則為例:
@app.route('/projects/') def projects(): return 'The project page' @app.route('/about') def about(): return 'The about page'
雖然它們看起來着實相似,但它們結尾斜線的使用在 URL 定義 中不同。 第一種情況中,指向 projects 的規范 URL 尾端有一個斜線。這種感覺很像在文件系統中的文件夾。訪問一個結尾不帶斜線的 URL 會被 Flask 重定向到帶斜線的規范 URL 去。
然而,第二種情況的 URL 結尾不帶斜線,類似 UNIX-like 系統下的文件的路徑名。訪問結尾帶斜線的 URL 會產生一個 404 “Not Found” 錯誤。
這個行為使得在遺忘尾斜線時,允許關聯的 URL 接任工作,與 Apache 和其它的服務器的行為並無二異。此外,也保證了 URL 的唯一,有助於避免搜索引擎索引同一個頁面兩次。
HTTP 方法
HTTP (與 Web 應用會話的協議)有許多不同的訪問 URL 方法。默認情況下,路由只回應 GET 請求,但是通過 route() 裝飾器傳遞 methods 參數可以改變這個行為。這里有一些例子:
@app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': do_the_login() else: show_the_login_form()
如果存在 GET ,那么也會替你自動地添加 HEAD,無需干預。它會確保遵照 HTTP RFC(描述 HTTP 協議的文檔)處理 HEAD 請求,所以你可以完全忽略這部分的 HTTP 規范。同樣,自從 Flask 0.6 起, 也實現了 OPTIONS 的自動處理。
你不知道一個 HTTP 方法是什么?不必擔心,這里會簡要介紹 HTTP 方法和它們為什么重要:
HTTP 方法(也經常被叫做“謂詞”)告知服務器,客戶端想對請求的頁面 做 些什么。下面的都是非常常見的方法:
- GET
- 瀏覽器告知服務器:只 獲取 頁面上的信息並發給我。這是最常用的方法。
- HEAD
- 瀏覽器告訴服務器:欲獲取信息,但是只關心 消息頭 。應用應像處理 GET 請求一樣來處理它,但是不分發實際內容。在 Flask 中你完全無需 人工 干預,底層的 Werkzeug 庫已經替你打點好了。
- POST
- 瀏覽器告訴服務器:想在 URL 上 發布 新信息。並且,服務器必須確保 數據已存儲且僅存儲一次。這是 HTML 表單通常發送數據到服務器的方法。
- PUT
- 類似 POST 但是服務器可能觸發了存儲過程多次,多次覆蓋掉舊值。你可 能會問這有什么用,當然這是有原因的。考慮到傳輸中連接可能會丟失,在 這種 情況下瀏覽器和服務器之間的系統可能安全地第二次接收請求,而 不破壞其它東西。因為 POST它只觸發一次,所以用 POST 是不可能的。
- DELETE
- 刪除給定位置的信息。
- OPTIONS
- 給客戶端提供一個敏捷的途徑來弄清這個 URL 支持哪些 HTTP 方法。 從 Flask 0.6 開始,實現了自動處理。
有趣的是,在 HTML4 和 XHTML1 中,表單只能以 GET 和 POST 方法提交到服務器。但是 JavaScript 和未來的 HTML 標准允許你使用其它所有的方法。此外,HTTP 最近變得相當流行,瀏覽器不再是唯一的 HTTP 客戶端。比如,許多版本控制系統就在使用 HTTP。