Flask二之快速入門

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

$ python hello.py
    * Running on  http://127.0.0.1:5000/

訪問 http://127.0.0.1:5000/ ,會看見 Hello World 問候。欲關閉服務器,按 Ctrl+C。flask

這段代碼作了什麼?瀏覽器

  1. 首先,咱們導入了 Flask 類。這個類的實例將會是咱們的 WSGI 應用程序
    2.接下來,咱們建立一個該類的實例,第一個參數是應用模塊或者包的名稱。 若是你使用單一的模服務器

塊(如本例),你應該使用 name ,由於模塊的名稱將會因其做爲單獨應用啓動仍是做爲模
塊導入而有不一樣( 也便是 '__main__' 或實際的導入名)。這是必須的,這樣 Flask 才知道到哪
去找模板、靜態文件等等。 詳情見 Flask的文檔。app

  1. 而後,咱們使用 route() 裝飾器告訴 Flask 什麼樣的URL 能觸發咱們的函數。
    4.這個函數的名字也在生成 URL 時被特定的函數採用,這個函數返回咱們想要顯示在用戶瀏覽器中函數

的信息。
5.最後咱們用 run() 函數來讓應用運行在本地服務器上。 其中 if name =='__main__': 確保服務器
只會在該腳本被 Python 解釋器直接執行的時候纔會運行,而不是做爲模塊導入的時候。post

(1)調試模式

若是你啓用了調試支持,服務器會在代碼修改後自動從新載入,並在發生錯誤時提供一個至關有用的調試器。
有兩種途徑來啓用調試模式:
一種是直接在應用對象上設置:搜索引擎

app.debug = True
app.run()

另外一種是做爲 run 方法的一個參數傳入:編碼

app.run(debug=True)

兩種方法的效果徹底相同。
【注意】url

  • 交互式調試器絕對不能用於生產環境。

(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
相關文章
相關標籤/搜索