一.一個最小的Flask應用
from flask import Flask
app = Flask(__name__)
#app是程式例項,一個專案只能有一個程式例項
@app.route(`/`)
#路由裝飾器
def hello_world():
#檢視函式
return `Hello World!`
#返回一個字串
if __name__ == `__main__`:
app.run()
把程式儲存為hello.py 用Python直譯器執行
$ python hello.py
* Running on http://127.0.0.1:5000/
訪問 http://127.0.0.1:5000/ ,會看見 Hello World 問候。欲關閉伺服器,按 Ctrl+C。
這段程式碼做了什麼?
-
首先,我們匯入了 Flask 類。這個類的例項將會是我們的 WSGI 應用程式
2.接下來,我們建立一個該類的例項,第一個引數是應用模組或者包的名稱。 如果你使用單一的模
塊(如本例),你應該使用 name ,因為模組的名稱將會因其作為單獨應用啟動還是作為模
塊匯入而有不同( 也即是 `__main__` 或實際的匯入名)。這是必須的,這樣 Flask 才知道到哪
去找模板、靜態檔案等等。 詳情見 Flask的文件。
-
然後,我們使用 route() 裝飾器告訴 Flask 什麼樣的URL 能觸發我們的函式。
4.這個函式的名字也在生成 URL 時被特定的函式採用,這個函式返回我們想要顯示在使用者瀏覽器中
的資訊。
5.最後我們用 run() 函式來讓應用執行在本地伺服器上。 其中 if name ==`__main__`: 確保伺服器
只會在該指令碼被 Python 直譯器直接執行的時候才會執行,而不是作為模組匯入的時候。
(1)除錯模式
如果你啟用了除錯支援,伺服器會在程式碼修改後自動重新載入,並在發生錯誤時提供一個相當有用的偵錯程式。
有兩種途徑來啟用除錯模式:
一種是直接在應用物件上設定:
app.debug = True
app.run()
另一種是作為 run 方法的一個引數傳入:
app.run(debug=True)
兩種方法的效果完全相同。
【注意】
-
互動式偵錯程式絕對不能用於生產環境。
(2)路由裝飾器
@app.route(`/`)
def index():
return `Index`
@app.route(`/hello/`)
def hello():
return `<h1>Hello world!</h1>`
這個函式的返回值稱為響應,是客戶端接收到的內容。
像 index() 這樣的函式稱為檢視函式(view function)。檢視函式返回的響應可
以是包含HTML 的簡單字串,也可以是複雜的表單。
(3)變數規則
@app.route(`/user/<name>`)
def showUserName(name):
return "User %s" %name
@app.route(`/post/<int:post_id>`)
def showPostId(post_id):
return "Post %d" %post_id
Flask 支援在路由中使用 int、 float 和 path 型別。path 型別也是字串,但
不把斜線視作分隔符,而將其當作動態片段的一部分。
int | 接受整數
float | 接受浮點數
path | 和預設的相似,但也接受斜線
變數規則的意義:處理動態資訊。
【注意】
-
app.route()函式中中括號裡的是變數名,必須與檢視函式的形參名一致!
-
如果是int或float型別,不能直接return!必須要轉換為字串格式才可以,否
則會報錯:TypeError: `int` object is not callable
(4)唯一 URL / 重定向行為
@app.route(`/about/`) # 建議用法
# @app.route(`/about`) # 不建議用法
def about():
return `The about page`
雖然它們看起來著實相似,但它們結尾斜線的使用在 URL 定義 中不同:
- 第一種情況中,指向 about的規範 URL 尾端有一個斜線。這種感覺很像在檔案系
統中的資料夾。訪問一個結尾不帶斜線的 URL 會被 Flask 重定向到帶斜線的規範
URL 去。因此, 強烈建議統一加上斜線!
- 第二種情況的 URL 結尾不帶斜線,類似 UNIX-like 系統下的檔案的路徑名。訪問
結尾帶斜線的URL 會產生一個 404 “Not Found” 錯誤。
這個行為使得在遺忘尾斜線時,允許關聯的 URL 接任工作,與 Apache 和其它的服
務器的行為並無二異。此外,也保證了 URL 的唯一,有助於避免搜尋引擎索引同一
個頁面兩次。
(5)重定向和錯誤
-
用 redirect() 函式把使用者重定向到其它地方。
-
用 abort() 函式放棄請求並返回錯誤程式碼。例如:
@app.route(`/redir/`)
def redir():
return redirect(`/login/`)
@app.route(`/login/`)
def login():
abort(401)
使用者會從/redir/重定向到一個不能訪問的頁面 (401 意味著禁止訪問)。
(6)構造URL
用 url_for()來給指定的函式生成(構造) URL。它接受函式名作為第一個引數,
也接受對應 URL 規則的變數部分的命名引數。例如:
@app.route(`/world/`)
def world():
# return redirect(`/hello/`)
# return redirect(url_for(`hello`))
# return redirect(url_for(`showUserName`,name = `liusheng`))
return redirect(url_for(`showPostId`, post_id = 100))
# 注意這裡的100可以是字串也可以是整型
使用url_for()生成 URL 而非在模板中硬編碼的好處:
1. 反向構建通常比硬編碼的描述性更好。允許一次性修改 URL,而不用到處邊找邊改。
2. URL 構建會轉義特殊字元和 Unicode 資料,免去你很多麻煩。
(7)使用Flask-Script支援命令列選項
Flask-Script 是一個 Flask 擴充套件,為 Flask 程式新增了一個命令列解析器。
Flask-Script 自帶了一組常用選項,而且還支援自定義命令。
Flask-Script 擴充套件使用 pip 安裝:
(venv) $ pip install flask-script
把命令列解析功能新增到 hello.py 程式中時需要修改的地方:
from flask_script import Manager
manager = Manager(app)
if __name__ == `__main__`:
manager.run()
修改之後程式可以使用一組基本命令列選項來啟動 Web 伺服器。:
python hello.py runserver
--host HOST |設定host為 HOST
--port PORT |設定port為 PORT
-d |設定以debug模式執行而非run模式
-r |設定自動重新載入(app.debug為True)
標準命令:
python hello.py runserver -d -r --host 0.0.0.0
python hello.py runserver -d -r --port:5001