[TOC]html
Django 主要特色是大而全,集成了不少組件,例如: Models Admin Form 等等, 無論你用獲得用不到,反正它全都有,屬於全能型框架python
Django 一般用於大型Web應用因爲內置組件足夠強大因此使用Django開發能夠一鼓作氣web
Django 優勢是大而全,缺點也就暴露出來了,這麼多的資源一次性所有加載,確定會形成一部分的資源浪費json
2.Tornado 主要特色是原生異步非阻塞,在IO密集型應用和多任務處理上佔據絕對性的優點,屬於專一型框架flask
3.Flask 主要特色小而輕,原生組件幾乎爲0, 三方提供的組件請參考Django 很是全面,屬於短小精悍型框架後端
pip install Flask
實現一個簡單的web程序:session
from flask import Flask #導入Flask類 # __name__指定當前文件名flask1.py app = Flask(__name__) #實例化一個Flask對象 # 指定路由,app中的route裝飾器 @app.route("/") def home(): #視圖函數 return "hello world!" #至關於HttpResponse返回數據 if __name__ == '__main__': # 定義訪問ip與port app.run("0.0.0.0", 5050)
web頁面展現:app
Flask中render_template至關於Django中render函數,返回一個模板,但Flask不須要指定request參數框架
from flask import Flask, render_template #導入Flask類 # __name__指定當前文件名 flask1 app = Flask(__name__) #實例化一個Flask對象 # 指定路由,app中的route裝飾器 @app.route("/home") def home(): return render_template("home.html") if __name__ == '__main__': # 定義訪問ip與port app.run("0.0.0.0", 5050)
home.html文件:異步
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>success!</h1> </body> </html>
注意: 若是要使用 render_template 返回渲染的模板,請在項目的主目錄中加入一個目錄 templates
Flask中redirect重定向同Django中的redirect函數,具體方法以下:
from flask import Flask,redirect #導入Flask類 # __name__指定當前文件名flask1.py app = Flask(__name__) #實例化一個Flask對象 # 指定路由,app中的route裝飾器 endpoint 給路由分配別名 若是不寫默認是當前函數名(不可重複) @app.route("/reback",endpoint="reback") def reback(): # 重定向指定路經前須要加「/」 return redirect("/index") if __name__ == '__main__': # 定義訪問ip與port app.run("0.0.0.0", 5050)
每一個框架中都有處理請求的機制(request),可是每一個框架的處理方式和機制是不一樣的
首先要從 flask 包中導入 request 模塊,Flask中request模塊是一個全局變量
methods=["POST", "GET"] 表明這個url地址容許 POST與GET 請求兩種方式,是個列表也就是意味着能夠容許多重請求方式,這裏表單提交須要經過GET顯示HTML頁面,再經過POST提交數據
from flask import Flask, render_template, request import os app = Flask(__name__) app.debug = True @app.route("/login", methods=["POST", "GET"]) def login(): if request.method == "GET": # 獲取URL中的參數,例如傳入參數:http://127.0.0.1:5000/login?id=1 print(request.args.get("id")) # 獲取URL中的參數 轉換成 字典 print(request.args.to_dict()) # 獲取請求原始信息 print(request.environ) # 路由地址 /login print(request.path) # 獲取訪問路徑 print(request.url) # http://127.0.0.1:5000/login?id=1 # 獲取URL頭,不包含參數 /login print(request.base_url) # http://127.0.0.1:5000/login return render_template("login.html") if request.method == "POST": # 請求頭中的數據 print(request.headers) print(request.json) # 請求頭中 Content-type:application/json 數據序列化 request.json print(request.data) # 請求頭中 Content-type 不包含 Form or data # Formdata 和 Args查詢參數 中的數據 print(request.values) username = request.form.get("user") password = request.form.get("pwd") print(username, password) return "200 OK" if __name__ == '__main__': app.run()
HTML的form表單:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post" enctype="multipart/form-data"> 用戶名:<input type="text" name="user"> 密碼:<input type="password" name="pwd"> <input type="submit" value="提交"> </form> <script></script> </body> </html>
Form表單中傳遞過來的值 使用 request.form 中拿到:
注意:這裏把ImmutableMultiDict 字典轉換成普通字典須要to_dict方法,不然會報錯
print(request.form) # ImmutableMultiDict([('user', '123'), ('pwd', '456')]) # ImmutableMultiDict 它是一個特殊字典 print(request.form["user"]) # 123 print(request.form.get("pwd")) # 456 print(list(request.form.keys())) # ['user', 'pwd'] #這裏能夠把上面的特殊字典轉化成普通字典形式,注意這裏Flask中字典轉換方法是to_dict req_dict = request.form.to_dict() print(req_dict) # {'user': '123', 'pwd': '456'}
這是讓咱們在使用form表單提交的同時使用url參數提交:
print(request.values) # CombinedMultiDict([ImmutableMultiDict([('id', '1'), ('age', '20')]), ImmutableMultiDict([('user', '123'), ('pwd', '456')])]) print(request.values.get("id")) # 1 print(request.values["user"]) # 123 # 這回喜歡直接操做字典的小夥伴們有驚喜了! to_dict() 方法能夠直接將咱們的參數所有轉爲字典形式 print(request.values.to_dict()) # {'user': '123', 'pwd': '456', 'id': '1', 'age': '20'}
注意啦!注意啦!
# 注意這裏的坑來啦! 坑來啦! # 若是url和form中的Key重名的話,form表單數據會先提交,則form中的同名的key中value會被url中的value覆蓋 # http://127.0.0.1:5000/req?id=1&user=20 print(request.values.to_dict()) # {'user': 20 'pwd': '456', 'id': '1'}
request.args 與 request.form 的區別就是:
from flask import Flask, render_template, request import os app = Flask(__name__) app.debug = True @app.route("/login", methods=["POST", "GET"]) def login(): if request.method == "GET": return render_template("login.html") if request.method == "POST": username = request.form.get("username") password = request.form.get("pwd") print(username, password) # 獲取文件對象 my_file = request.files.get("my_file") print(my_file) # 指定文件保存路徑 # filepath = os.path.join("templates", my_file.filename) # my_file.save(filepath) # 保存文件,file_name獲取文件名 my_file.save(my_file.filename) return "200 OK" if __name__ == '__main__': app.run()
login.html文件:
form表單提交文件時,必須指定文件類型:enctype="multipart/form-data"
... <form action="" method="post" enctype="multipart/form-data"> 用戶名:<input type="text" name="username"> 密碼:<input type="password" name="pwd"> <input type="file" name="my_file"> <input type="submit" value="提交"></form> ...
解決方案:
@app.route("/login",methods=["GET","POST"])
解決方法:設置祕鑰
app.secret_key = "sdsfdsgdfgdfgfh"
附加: