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
這段代碼作了什麼?瀏覽器
首先,咱們導入了 Flask 類。這個類的實例將會是咱們的 WSGI 應用程序
2.接下來,咱們建立一個該類的實例,第一個參數是應用模塊或者包的名稱。 若是你使用單一的模服務器
塊(如本例),你應該使用 name ,由於模塊的名稱將會因其做爲單獨應用啓動仍是做爲模
塊導入而有不一樣( 也便是 '__main__' 或實際的導入名)。這是必須的,這樣 Flask 才知道到哪
去找模板、靜態文件等等。 詳情見 Flask的文檔。app
而後,咱們使用 route() 裝飾器告訴 Flask 什麼樣的URL 能觸發咱們的函數。
4.這個函數的名字也在生成 URL 時被特定的函數採用,這個函數返回咱們想要顯示在用戶瀏覽器中函數
的信息。
5.最後咱們用 run() 函數來讓應用運行在本地服務器上。 其中 if name =='__main__': 確保服務器
只會在該腳本被 Python 解釋器直接執行的時候纔會運行,而不是做爲模塊導入的時候。post
若是你啓用了調試支持,服務器會在代碼修改後自動從新載入,並在發生錯誤時提供一個至關有用的調試器。
有兩種途徑來啓用調試模式:
一種是直接在應用對象上設置:搜索引擎
app.debug = True app.run()
另外一種是做爲 run 方法的一個參數傳入:編碼
app.run(debug=True)
兩種方法的效果徹底相同。
【注意】url
交互式調試器絕對不能用於生產環境。
@app.route('/') def index(): return 'Index' @app.route('/hello/') def hello(): return '<h1>Hello world!</h1>'
這個函數的返回值稱爲響應,是客戶端接收到的內容。
像 index() 這樣的函數稱爲視圖函數(view function)。視圖函數返回的響應可
以是包含HTML 的簡單字符串,也能夠是複雜的表單。
@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
@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 的惟一,有助於避免搜索引擎索引同一
個頁面兩次。
用 redirect() 函數把用戶重定向到其它地方。
用 abort() 函數放棄請求並返回錯誤代碼。例如:
@app.route('/redir/') def redir(): return redirect('/login/') @app.route('/login/') def login(): abort(401)
用戶會從/redir/重定向到一個不能訪問的頁面 (401 意味着禁止訪問)。
用 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 數據,免去你不少麻煩。
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