$ export FLASK_APP=hello.py $ flask run --host=0.0.0.0 * Running on http://127.0.0.1:5000/
$ export FLASK_APP=hello.py $ python -m flask run * Running on http://127.0.0.1:5000/
首先,我們導入了 Flask 類。這個類的實例將會是我們的 WSGI 應用程序。
接下來,我們創建一個該類的實例,第一個參數是應用模塊或者包的名稱。 如果你使用單一的模塊(如本例),你應該使用 __name__ ,因爲取決於作爲單獨應用啓動或者模塊導入,它的名稱將會不同( '__main__' 相對實際的導入名稱)。這是必須的,這樣Flask 纔會知道到哪裏去尋找模板、 靜態文件等等。詳情參見 Flask 的文檔。
然後,我們使用 route() 裝飾器告訴 Flask 什麼樣的 URL 應該觸發我們的函數。
這個函數的名字也用作給特定的函數生成 URL,並且返回我們想要顯示在用戶瀏覽器中的信息。
最後我們用 run() 函數來讓應用運行在本地服務器上。 其中 if __name__ =='__main__': 確保服務器只會在該腳本被 Python 解釋器直接執行的時候纔會運行,而不是作爲模塊導入的時候。
if __name__ == '__main__':
#app.debug = True
app.run(host='0.0.0.0', debug=True)
<converter:variable_name>
現有的轉換器如下:
int 接受整數
float 同 int ,但是接受浮點數
path 和默認的相似,但也接受斜線
唯一的網址 / 重定向行爲
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 定義 中不同。 第一種情況中,規範的 URL 指向 projects 尾端有一個斜線。這種感覺很像在文件系統中的文件夾。訪問一個結尾不帶斜線的 URL 會被 Flask 重定向到帶斜線的規範 URL 去。
然而,第二種情況的 URL 結尾不帶斜線,類似 UNIX-like 系統下的文件的路徑名。訪問結尾帶斜線的 URL 會產生一個 404 “Not Found” 錯誤。
當用戶訪問頁面時忘記結尾斜線時,這個行爲允許關聯的 URL 繼續工作,並且與 Apache 和其它的服務器的行爲一致。另外,URL 會保持唯一,有助於避免搜索引擎索引同一個頁面兩次。
你可以用 url_for() 來給指定的函數構造 URL。它接受函數名作爲第一個參數,也接受對應 URL 規則的變量部分的命名參數。未知變量部分會添加到 URL 末尾作爲查詢參數。
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index(): pass
@app.route('/login')
def login(): pass
@app.route('/user/<username>')
def profile(username): pass
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
print(url_for('login', next='/'))
print(url_for('profile', username='John Doe'))
給靜態文件生成 URL ,使用特殊的 'static' 端點名:
url_for('static', filename='style.css')
這個文件應該存儲在文件系統上的 static/style.css 。
默認情況下,路由只回應GET請求,但是通過 route() 裝飾器傳遞methods參數可以改變這個行爲。
用 Python 生成 HTML 十分無趣,而且相當繁瑣,因爲你必須手動對 HTML 做轉義來保證應用的安全。爲此,Flask 配備了 Jinja2 模板引擎。
自動轉義功能默認是開啓的,所以如果name包含 HTML ,它將會被自動轉義。如果你能信任一個變量,並且你知道它是安全的(例如一個模塊把 Wiki 標記轉換爲 HTML),你可以用 Markup 類或 |safe 過濾器在模板中把它標記爲安全的。在 Jinja 2 文檔中,你會看到更多的例子。
用 Flask 處理文件上傳很簡單。只要確保你沒忘記在 HTML 表單中設置 enctype="multipart/form-data" 屬性,不然你的瀏覽器根本不會發送文件。
已上傳的文件存儲在內存或是文件系統中一個臨時的位置。你可以通過請求對象的 files 屬性訪問它們。每個上傳的文件都會存儲在這個字典裏。它表現近乎爲一個標準的 Python file 對象,但它還有一個 save() 方法,這個方法允許你把文件保存到服務器的文件系統上。
你可以通過 cookies 屬性來訪問 Cookies,用響應對象的 set_cookie 方法來設置 Cookies。請求對象的 cookies 屬性是一個內容爲客戶端提交的所有 Cookies 的字典。如果你想使用會話,請不要直接使用 Cookies。
由於通常視圖函數只是返回字符串,之後 Flask 將字符串轉換爲響應對象。如果你要顯式地轉換,你可以使用 make_response() 函數然後再進行修改。
你可以用 redirect() 函數把用戶重定向到其它地方。放棄請求並返回錯誤代碼,用 abort() 函數。
默認情況下,錯誤代碼會顯示一個黑白的錯誤頁面。如果你要定製錯誤頁面, 可以使用 errorhandler() 裝飾器:
from flask import page_not_found(error): return render_template('page_not_found.html'), 404
注意 render_template() 調用之後的 404 。這告訴 Flask,該頁的錯誤代碼是 404 ,即沒有找到。默認爲 200,也就是一切正常。
視圖函數的返回值會被自動轉換爲一個響應對象。如果返回值是一個字符串, 它被轉換爲該字符串爲主體的、狀態碼爲 200 OK``的 、 MIME 類型是 ``text/html 的響應對象。Flask 把返回值轉換爲響應對象的邏輯是這樣:
如果返回的是一個合法的響應對象,它會從視圖直接返回。
如果返回的是一個字符串,響應對象會用字符串數據和默認參數創建。
如果返回的是一個元組,且元組中的元素可以提供額外的信息。這樣的元組必須是 (response, status, headers) 的形式,且至少包含一個元素。status值會覆蓋狀態代碼,headers可以是一個列表或字典,作爲額外的消息標頭值。
如果上述條件均不滿足, Flask 會假設返回值是一個合法的 WSGI 應用程序,並轉換爲一個請求對象。
除請求對象之外,還有一個 session 對象。它允許你在不同請求間存儲特定用戶的信息。它是在 Cookies 的基礎上實現的,並且對 Cookies 進行密鑰簽名。這意味着用戶可以查看你 Cookie 的內容,但卻不能修改它,除非用戶知道簽名的密鑰。
隨機的問題在於很難判斷什麼是真隨機。一個密鑰應該足夠隨機。你的操作系統可以基於一個密鑰隨機生成器來生成漂亮的隨機值,這個值可以用來做密鑰:
>>> import os >>> os.urandom(24)'\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'
使用基於 cookie 的會話需注意: Flask 會將你放進會話對象的值序列化至 Cookies。如果你發現某些值在請求之間並沒有持久存在,然而確實已經啓用了 Cookies,但也沒有得到明確的錯誤信息。這時,請檢查你的頁面響應中的 Cookies 的大小,並與 Web 瀏覽器所支持的大小對比。
Flask 提供了兩種環境(Context):應用環境(Application Context)和請求環境(Request Context)。不同環境有不同的特殊變量。例如 request 變量與當前請求的請求對象有關, 而 g 是與當前應用環境有關的通用變量。
teardown_appcontext() 標記的函數會在每次應用環境銷燬時調用。這意味着什麼?本質上,應用環境在請求傳入前創建,每當請求結束時銷燬。銷燬有兩種原因:一切正常(錯誤參數會是None)或發生異常,後者情況中,錯誤會被傳遞給銷燬時函數。