1.當客戶端想要獲取資源時,通常會經過瀏覽器發起http請求html
2.此時,Web服務器會把來自客戶端的全部請求都交給Flask程序實例python
3.程序實例使用Werkzeug來作路由分發(URL請求和視圖函數之間的對應關係)web
4.根據每一個URL請求,找到具體的視圖函數並進行調用flask
在Flask程序中,路由的實現通常是經過程序實例的裝飾器實現瀏覽器
5.Flask調用視圖函數後,能夠返回兩種內容:服務器
1.字符串內容:將視圖函數的返回值做爲響應的內容,返回給客戶端app
2.HTML模板內容:獲取到數據後,把數據傳入HTML模板文件中,模板引擎(Jinja2)負責渲染HTTP響應數據,而後返回響應數據給客戶端函數
# -*- coding:utf-8 -*- # 1.導入Flask擴展 from flask import Flask # 2.建立Flask應用程序實例 # 須要傳入__name__,做用是爲了肯定資源所在路徑 app = Flask(__name__) # 3.定義路由及視圖函數 # Flask中定義路由是經過裝飾器實現的,路由默認只支持GET,若是須要增長,須要自行指定 @app.route('/',methods=['GET','POST']) def hello_world(): return 'Hello Flask' # 4.啓動程序 if __name__ == '__main__': # 執行了app.run()就會將Flask程序運行在一個簡易的服務器(Flask提供的,用於測試的)上 app.run()
默認路由只支持GET請求,可是能夠經過methods指定http請求的方式測試
如:@app.route('/',methods=['GET','POST'])url
有時候咱們須要將同一類URL映射到同一個視圖函數處理,好比使用同一個視圖函數來顯示不一樣用戶的訂單信息
路由傳遞的參數默當作string:
# -*- coding:utf-8 -*- # 1.導入Flask擴展 from flask import Flask # 2.建立Flask應用程序實例 # 須要傳入__name__,做用是爲了肯定資源所在路徑 app = Flask(__name__) # 3.定義路由及視圖函數 # Flask中定義路由是經過裝飾器實現的 @app.route('/') def hello_world(): return 'Hello Flask' # 使用同一個視圖函數,來顯示不一樣用戶的訂單信息,<>定義路由的參數,<>內須要起一個名字 @app.route('/orders/<int:order_id>')# 參數默認類型爲字符串,經過int:強制轉換,若是轉換失敗沒法匹配該路由,如今參數爲int類型 def get_order_id(order_id): # 須要在視圖函數的()內填入參數名,那麼後面的代碼才能去使用 return 'order_id: %s' % order_id # 4.啓動程序 if __name__ == '__main__': # 執行了app.run()就會將Flask程序運行在一個簡易的服務器(Flask提供的,用於測試的)上 app.run()
使用模板的好處
1.視圖函數只負責業務邏輯和數據處理(業務邏輯方面)
2.而模板則取到視圖函數的數據結果進行展現(視圖展現方面)
3.代碼結構清晰,耦合度低
兩個概念
1.Jinja2:是python下一個被普遍應用的模板引擎,是由python實現的模板語言,他的設計思想來源於Django的模板引擎,並擴展了其餘語法和一系列強大的功能,其是Flask內置的模板語言
2.模板語言:是一種被設計來自動生成文檔的簡單文本格式,在模板語言中,通常都會把一些變量傳給模板,替換模板的特定位置上預先定義好的佔位變量名.
好比:render_template('index.html', 模板中要使用的變量名=視圖函數中的變量)
模板渲染函數
Flask提供的render_template函數封裝了該模板引擎
render_template函數的第一個參數是模板的文件名(須要放在templates目錄下面),後面的參數都是鍵值對,表示模板中變量對應的真是值
模板語言的使用
1.使用{# #}進行註釋
2.變量代碼塊
{{}}來表示變量名,這種{{}}語法叫作變量代碼塊
3.Jinja2模板中的變量代碼能夠是Python類型或者對象,只要它可以被python的str()方法轉換爲一個字符串就能夠
控制代碼塊
用{%%}定義的控制代碼塊,能夠實現一些語言層次的功能,好比循環或if語句
{% if user %}
{{user}}
{% else %}
{% for index in indexs%}
{{index}}
{% endfor %}
過濾器
過濾器的本質就是函數,有時候咱們不單單只是須要輸出變量的值,咱們還須要修改變量的顯示,甚至格式化,運算等,而在模板中是不能直接調用python中的某些方法,那麼就用到了過濾器
使用方式:
過濾器的使用方式爲:變量名|過濾器
{{variable | filter_name(*args)}}
若是沒有任何參數傳遞給過濾器,則能夠把括號省略掉
{{variable | filter_name}}
鏈式調用
{{variable | filter_name1 | filter_name2}}
from flask import Flask, render_template app = Flask(__name__) # 1.返回一個網頁(模板) # 2.給模板填充數據 @app.route('/') def index(): url_str = 'www.baidu.com' my_list = [1,3,5,7] # html文件須要放在templates目錄下 return render_template('index.html', tem_url=url_str, my_list=my_list) if __name__ == '__main__': app.run(debug=True)
<!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8'> <title>Flask</title> </head> <body> {#這是模板 #} 這是首頁<br> 百度網址:{{tem_url}} <hr> {%for num in my_list%} {% if num >=3 %} {{num}}<br> {% endif %} {% endfor%} {#過濾器#} {{tem_url | upper}} </body> </html>
Web表單
在Flask中,爲了處理web表單,通常使用Flask-WTF擴展,它封裝了WTForms,而且它有驗證表單數據的功能