Flask二之快速入門

netScorpion發表於2019-02-16

一.一個最小的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。

這段程式碼做了什麼?

  1. 首先,我們匯入了 Flask 類。這個類的例項將會是我們的 WSGI 應用程式
    2.接下來,我們建立一個該類的例項,第一個引數是應用模組或者包的名稱。 如果你使用單一的模

塊(如本例),你應該使用 name ,因為模組的名稱將會因其作為單獨應用啟動還是作為模
塊匯入而有不同( 也即是 `__main__` 或實際的匯入名)。這是必須的,這樣 Flask 才知道到哪
去找模板、靜態檔案等等。 詳情見 Flask的文件。

  1. 然後,我們使用 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 | 和預設的相似,但也接受斜線
變數規則的意義:處理動態資訊。
【注意】

  1. app.route()函式中中括號裡的是變數名,必須與檢視函式的形參名一致!

  2. 如果是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

相關文章