特色: 1.Django的特色是大而全,集成了不少組件,屬於全能型框架 2.tornado的主要特色是原生異步非阻塞,在IO密集型和多任務處理上佔有絕對優點,屬於專一型框架 3.flask的的特色是小而輕,原生組件幾乎爲0 使用類型: 1.Django適用於大型的web應用,因爲內部的組件足夠強大,可使開發一鼓作氣 2.tornado適用於api後端應用,常服務於遊戲後臺,由於內部的異步非阻塞很是穩 3.簡單的應用用flask很是簡潔,大型的應用Django和flask均可以 缺點: 1.djnago的缺點是資源一次性所有加載,會形成資源浪費 2.tornado太乾淨了,連個session都不支持 3.flask相對不妥當,因爲依賴第三方
pip3 install flask
第三方組件:http://flask.pocoo.org/html
from flask import Flask ,jsonify app = Flask(__name__) app.run(debug=True)
from flask import Flask #導入flask類 app = Flask(__name__) #實例化一個flask對象app @app.route("/") #router裝飾器 def index(): #視圖函數 return "aaa" app.run("0.0.0.0",5000,debug=True) #啓動flask web應用
1.Flask中的HttpResponse其實 就是直接返回字符串前端
@app.route("/") def index(): return "aaa"
2.Flask中的Redirect python
from flask import Flask,redirect app = Flask(__name__) @app.route("/") def index(): return redirect("/index") #在訪問"/"時,重定向到"/index" @app.route("/index") def index1(): return "重定向" app.run("0.0.0.0",5000,debug=True)
3.Flask中的renderweb
from flask import Flask,render_template app = Flask(__name__) @app.route("/index") def index1(): return render_template('index.html') app.run("0.0.0.0",5000,debug=True) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>這是index.html</div> </body> </html>
4.除Render Redirect HttpResponse外,Flask特有的jsonify與senf_filejson
(1)jsonify(與json.dumps不一樣的是會有請求頭application/json)flask
from flask import Flask,render_template,jsonify app = Flask(__name__) @app.route("/") def index1(): return jsonify({"aa":1}) app.run("0.0.0.0",5000,debug=True)
(2)send_file後端
from flask import Flask,render_template,send_file app = Flask(__name__) @app.route("/") def index1(): name="shy" return send_file("dvd.mp4") app.run("0.0.0.0",5000,debug=True)
send_file能夠返回文字,文件,圖片,視頻等等,自動識別文件是什麼類型的文件,在Content-Type:後加文件類型api
get post delete put
option trace connnect head
methods參數安全
from flask import Flask,render_template,send_file app = Flask(__name__) @app.route("/",methods=["POST"])#規定了methods參數後,其餘請求就沒法訪問該視圖函數 def index1(): name="shy" return send_file("dvd.mp4") app.run("0.0.0.0",5000,debug=True)
request.method:獲取請求方式的名字 request.form:存放formdata中的數據(前端中表單中的數據) request.args:獲取url中的數據 如:ImmutableMultiDict([('a', '1')]),能夠to_dict()轉化成字典 request.url:訪問的完整路徑 如:http://127.168.13.61:5000/?a=1 request.path:路由地址 如:/index request.host:主機地址 如:127.168.13.61:5000 request.host-url:http+主機地址 如:http://127.168.13.61:5000/index request.json:若是請求頭中的contentType:aplication/json,直接序列化 request.data:若是請求頭中的contentType:aplication/dfsg,不知道怎麼序列化時沒法被識別,請求體中的原始數據放到這 request.values:用於查看數據一般不用來獲取數據 如:CombinedMultiDict([ImmutableMultiDict([('a', '1')]), ImmutableMultiDict([])]) request.files:獲取文件信息 request.cookies:獲取cookie中的數據 request.headers:獲取請求頭
注:to_dict方法cookie
to_dict方法:相似這樣ImmutableMultiDict,CombinedMultiDict,像字典同樣的數據類型,均可以使用to_dict方法,request.values.to_dict():會出現覆蓋問題
1.引用變量(字典的傳遞)
from flask import Flask,redirect,render_template,request app = Flask(__name__) STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'} @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陸失敗" @app.route("/index") def index(): return render_template('index.html',stu=STUDENT) app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>這是index.html</div> 學生信息{{ stu }} <table> <tr> <td>{{ stu.name }}</td> <td>{{ stu.age }}</td> <td>{{ stu.gender }}</td> </tr> <tr> </tr> </table> </body> </html>
2.邏輯代碼(列表的傳遞)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>這是index.html</div> 學生信息{{ stu }} <table> <tr> <td>{{ stu.name }}</td> <td>{{ stu.age }}</td> <td>{{ stu.gender }}</td> </tr> {% for foo in lis %} <tr> <td>{{ foo.name }}</td> <td>{{ foo.age }}</td> <td>{{ foo.gender }}</td> </tr> {% endfor %} </table> </body> </html>
3.Markup的使用(至關於 |safe,安全標籤字符串)(標籤字符串的傳遞)
from flask import Flask,redirect,render_template,request,Markup app = Flask(__name__) ############################## word="<p>hahaha</p>" word1=Markup(word) ############################## @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陸失敗" @app.route("/index") def index(): return render_template('index.html',stu=STUDENT,lis=STUDENT_LIST,word=word1) app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>這是index.html</div> ########################## {{ word }} ########################## </body> </html>
4.函數的傳遞
(1)單個函數的傳遞
from flask import Flask,redirect,render_template,request,Markup app = Flask(__name__) def add(a,b): return a+b @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陸失敗" @app.route("/index") def index(): return render_template('index.html',func=add) app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>這是index.html</div> 學生信息{{ stu }} {{ func(1,2) }} </body> </html>
(2)template_global,若是數量多的話,變成全局均可以使用的函數
from flask import Flask,redirect,render_template,request,Markup app = Flask(__name__) ############################# @app.template_global()#template_global是一個特殊的裝飾器 def add(a,b): return a+b ############################## @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陸失敗" @app.route("/index") def index(): return render_template('index.html') app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>這是index.html</div> 學生信息{{ stu }} {{ add(2,2) }} </body> </html>
(3)能夠傳遞參數的全局函數
from flask import Flask,redirect,render_template,request,Markup app = Flask(__name__) @app.template_filter() def fil(a,b,c): return a+b+c @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陸失敗" @app.route("/index") def index(): return render_template('index.html') app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>這是index.html</div> 學生信息{{ stu }} {{ 1 |fil(2,3) }} </body> </html>
5.宏macro
from flask import Flask,redirect,render_template,request,Markup app = Flask(__name__) @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陸失敗" @app.route("/index") def index(): return render_template('index.html') app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>這是index.html</div> 學生信息{{ stu }} #################定義宏##################### {% macro create_input(na,ty) %} 用戶名:{{ na }}<input type="{{ ty }}" name="{{ na }}"> {% endmacro %} ##################給宏傳值##################### {{ create_input("username","text") }} </body> </html>
from flask import session app = Flask(__name__) app.secret_key = "DragonFire" #用來加密的字符串
設置session
session["username"]="shy"
獲取session
session.get("username")#若是出現KeyError,說明沒有這個key的session
session機制:flask中的session是存儲在cookie中的,爲了節省flask的開銷