Flask

$ 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/
  1. 首先,我們導入了 Flask 類。這個類的實例將會是我們的 WSGI 應用程序。

  2. 接下來,我們創建一個該類的實例,第一個參數是應用模塊或者包的名稱。 如果你使用單一的模塊(如本例),你應該使用 __name__ ,因爲取決於作爲單獨應用啓動或者模塊導入,它的名稱將會不同( '__main__' 相對實際的導入名稱)。這是必須的,這樣Flask 纔會知道到哪裏去尋找模板、 靜態文件等等。詳情參見 Flask 的文檔。

  3. 然後,我們使用 route() 裝飾器告訴 Flask 什麼樣的 URL 應該觸發我們的函數。

  4. 這個函數的名字也用作給特定的函數生成 URL,並且返回我們想要顯示在用戶瀏覽器中的信息。

  5. 最後我們用 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 把返回值轉換爲響應對象的邏輯是這樣:

  1. 如果返回的是一個合法的響應對象,它會從視圖直接返回。

  2. 如果返回的是一個字符串,響應對象會用字符串數據和默認參數創建。

  3. 如果返回的是一個元組,且元組中的元素可以提供額外的信息。這樣的元組必須是 (response, status, headers) 的形式,且至少包含一個元素。status值會覆蓋狀態代碼,headers可以是一個列表或字典,作爲額外的消息標頭值。

  4. 如果上述條件均不滿足, 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)或發生異常,後者情況中,錯誤會被傳遞給銷燬時函數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章