pip install flask
最小的應用會是這樣css
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
把它保存爲 hello.py (或是相似的),而後用 Python 解釋器來運行。 確保你的應用文件名不是 flask.py ,由於這將與 Flask 自己衝突。html
$ python hello.py * Running on http://127.0.0.1:5000/
如今訪問 http://127.0.0.1:5000/ ,你會看見 Hello World 問候。python
欲關閉服務器,按 Ctrl+C。flask
能夠簡單修改調用 run() 的方法使你的服務器公開可用,以下:api
app.run(host='0.0.0.0') 這會讓操做系統監聽全部公網 IP。
雖然 run() 方法適用於啓動本地的開發服務器,可是你每次修改代碼後都要手動重啓它。這樣並不夠優雅,並且 Flask 能夠作到更好。若是你啓用了調試支持,服務器會在代碼修改後自動從新載入,並在發生錯誤時提供一個至關有用的調試器。注意:此操做僅限於開發模式,毫不能用於生產環境瀏覽器
有兩種途徑來啓用調試模式。一種是直接在應用對象上設置:bash
app.debug = True app.run()
另外一種是做爲 run 方法的一個參數傳入:服務器
app.run(debug=True)
兩種方法的效果徹底相同。app
構建路由有兩種方式:函數
1. 使用@app.route()裝飾器把一個函數綁定到對應的URL上
@app.route('/') def index(): return 'Index Page' @app.route('/hello') @app.route('/hello_two') # 能夠定義多個URL到同一個視圖函數上,Flask支持 def hello(): return 'Hello World'
2. 經過 app.add_url_rule,使用格式爲
add_url_rule(self, rule, endpoint=None, view_func=None, **options) rule: url 規則字符串,能夠是靜態的 /path,也能夠包含 / endpoint:要註冊規則的 endpoint,默認是 view_func 的名字,注意這裏endpoint是不能重複的 view_func:對應 url 的處理函數,也被稱爲視圖函數
示例以下:
def index(): return 'Index Page' def hello(): return 'Hello World' app.add_url_rule('/', 'index', index) app.add_url_rule('/hello', 'hello', hello)
要給 URL 添加變量部分,你能夠把這些特殊的字段標記爲 <variable_name> , 這個部分將會做爲命名參數傳遞到你的函數。規則能夠用 <converter:variable_name> 指定一個可選的轉換器。
@app.route('/user/<username>') def show_user_profile(username): # show the user profile for that user return 'User %s' % username @app.route('/post/<int:post_id>') def show_post(post_id): # show the post with the given id, the id is an integer return 'Post %d' % post_id
轉換器converter有如下幾種
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 定義 中不一樣。 第一種狀況中,指向 projects 的規範 URL 尾端有一個斜線。這種感受很像在文件系統中的文件夾。訪問一個結尾不帶斜線的 URL 會被 Flask 重定向到帶斜線的規範 URL 去。
如:
http://127.0.0.1:5000/projects 會被重定向到 http://127.0.0.1:5000/projects/
然而,第二種狀況的 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 hello_world(): return 'Hello World!' @app.route('/user/<username>') def show_user_profile(username): # show the user profile for that user return 'User %s' % username @app.route('/projects/') def projects(): return 'The project page' @app.route('/about') def about(): print(url_for('hello_world')) print(url_for('projects')) print(url_for('projects', next='/')) print(url_for('show_user_profile', username='zzq')) return 'The about page' if __name__ == '__main__': app.run(host='0.0.0.0', debug=True)
訪問http://127.0.0.1:5000/about,輸出
/ /projects/ /projects/?next=%2F /user/z%20q
它能正確轉義字符,相對路徑等
默認狀況下,路由只回應 GET 請求,可是經過 route() 裝飾器傳遞 methods 參數能夠改變這個行爲
@app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': do_the_login() else: show_the_login_form()
只要在你的包中或是模塊的所在目錄中建立一個名爲 static 的文件夾,在應用中使用 /static 便可訪問。
如:static文件夾下有style.css, 那麼訪問路徑: http://127.0.0.1:5000/static/style.css
注意:給靜態文件生成 URL ,使用特殊的 'static' 端點名:
url_for('static', filename='style.css')
Flask 配備了 Jinja2 模板引擎。
你可使用 render_template() 方法來渲染模板。你須要作的一切就是將模板名和你想做爲關鍵字的參數傳入模板的變量。這裏有一個展現如何渲染模板的簡例:
from flask import render_template @app.route('/hello/') @app.route('/hello/<name>') def hello(name=None): return render_template('hello.html', name=name) # hello.html <!doctype html> <title>Hello from Flask</title> {% if name %} <h1>Hello {{ name }}!</h1> {% else %} <h1>Hello World!</h1> {% endif %}
Flask 會在 templates 文件夾裏尋找模板。因此,若是你的應用是個模塊,這個文件夾應該與模塊同級;若是它是一個包,那麼這個文件夾做爲包的子目錄
狀況 1: 模塊:
/application.py /templates /hello.html
狀況 2: 包:
/application /__init__.py /templates /hello.html
自動轉義功能默認是開啓的,因此若是 name 包含 HTML ,它將會被自動轉義。
有時咱們返回的有html標籤,須要瀏覽器解析,這時就不須要轉義。經過 |safe 處理
附: