python現階段三大主流Web框架: Django, Flask, Tornado對比.html
1. Django主要特色是大而全, 集成了不少組件, 例如: models, admin, form等, 無論你用獲得用不到, 反正它全都有, 屬於全能型框架.前端
Django一般用於大型Web應用因爲內置組件足夠強大因此使用Django開發能夠一鼓作氣.python
Django優勢是大而全, 缺點也就暴露出來, 這麼多的資源一次性所有加載, 確定會形成一部分的資源浪費.django
2. Flask主要特色是小而輕, 原生組件幾乎爲0, 三方提供的組件參考Django, 很是全面, 屬於短小精悍型框架.json
Flask一般用於小型應用和快速構建應用, 其強大的三方庫, 足以支撐一個大型的Web應用.flask
Flask優勢是精悍簡單後端
3. Tornado主要特色是原生異步非阻塞, 在IO密集型應用和多處理任務上佔據絕對的優點, 屬於專一性框架.安全
Tornado一般應用於API後端應用, 遊戲服務後臺, 其內部實現的異步非阻塞很穩定.服務器
Tornado優勢是異步, 缺點是乾淨, 連session都不支持.session
函數初始化
全部Flask程序都必需要建立一個程序實例. Web服務器使用WSGI協議吧不接受自客戶端的全部請求轉交給這個對象處理. 程序實例是Flask類的對象, 常用如下方法建立 :
from flask import Flask app = Flask(__name__)
Flask類的構造函數只有一個必須指定的參數, 即程序主模塊或者包的名字. 在大多數程序中, python的__name__變量就是所需的值.
Flask使用__name__參數決定程序的根目錄, 以便之後能夠方便的找到相對於程序根目錄的資源文件的位置.
Response返回對象 :
HttpResponse : 直接返回字符串
Redirect : 重定向
render_template : HTML模板渲染, 返回html頁面
○ 使用render_template返回渲染頁面, 須要在項目中加入一個目錄templates(源碼默認設置), 而且右鍵templates目錄 -> mark directory as 選擇 Jinja2 模板語言.
send_file("文件路徑") : 返回文件(圖片, 音頻, 視頻)
jsonify("{id:1}") : 返回json格式的字符串(在響應頭內加入了Content-Type:application/json)
Request請求 :
每一個框架中都有處理請求的機制(request), 可是每一個框架的處理方式和機制都是不一樣的
在flask中導入request模塊.
request.method # 請求方式 request.form # ImmutableMultiDict([])以看起來像字典的形式存儲全部FormData的數據(支持字典的存取方法) request.form.to_dict() # 將ImmutableMultiDict數據格式轉換爲字典格式 request.args # 存儲url上全部的參數數據 request.json # 若是在請求中寫入了"application/json", 使用request.json則返回json解析數據, 不然返回None request.data # request是基於mimetype進行處理的, 若是content-type沒法被解析時(即不屬於mimetype類型), 存放沒法處理的原始數據 request.url # 當前url的路徑的所有路徑 request.path # url的路由的地址 request.host # 主機地址 request.host_url # 將主機地址轉換爲httpurl request.files # 接收存放在FormData中文件類型的數據 ----------------------------------------------------------------------------------------- request.args和request.form區別 : request.args 是獲取url中的參數 request.form 是獲取form表單中的參數 而request.values是獲取url + form內的全部參數(不建議使用, 當url和form中的參數名相同時, url的參數值會取代form參數值, 字典內不能有相同的key)
Jinja2模板語言 :
flask內的模板語言和django中用法基本相同, 不過flask在前端去數據時支持字典的取法
# 1. Jinja2模板語言中的for {% for i in j %} {% endfor %}
# 2. Jinja2模板語言的if {% if i %} {% elif j %} {% else %} {% endif %}
# 3. Jinja2模板語言的safe 當後端想給前端傳遞一個標籤數據時, 前端直接顯示會出現傳遞的代碼數據, 而前端的解決辦法是使用過濾方法" |safe ". 然後端的解決辦法是 : 使用flask的Markup模塊(markup(標籤變量)), Markup幫助我們在HTML的標籤上作了一層封裝,讓Jinja2模板語言知道這是一個安全的HTML標籤 兩種方法獲得的結果相同.
# 4. Jinja2中執行python函數 想在Jinja2中執行函數, 能夠在後端定義一個函數, 而且將函數名複製給一個變量傳遞給前端, 前端傳入參數執行. 也可使用flask的全局函數, 不須要後端將函數複製變量傳遞給前端, 前端能夠直接執行的函數. 定義全局函數須要後端使用@app.template_global()和@app.tempkate_filter()進行裝飾 不過@app.tempkate_filter()的調用方法比較特別: {{ 參數1 | 定義的全局函數名(參數2, 參數3) }}
# 5. Jinja2的繼承和include Jinja2的模板語言的繼承include和和django內的使用方法類似 {% block xx %} # 在母版內定義繼承塊 {% endblock %} {% extends "母版名" %} # 在子模版內首行寫繼承語法 {% block xx %} {% endblock %} 當某一段代碼重複使用機率很是高時, 能夠將其單獨寫入一個頁面, 使用include進行調用: {% include "複用代碼名" %} # 調用語法