1.Python 現階段三大主流Web框架 Django Tornado Flask 對比
Django 主要特點是大而全,集成了很多組件,例如: Models Admin Form 等等, 不管你用得到用不到,反正它全都有,屬於全能型框架
-
Django 通常用於大型Web應用由於內置組件足夠強大所以使用Django開發可以一氣呵成
-
Django 優點是大而全,缺點也就暴露出來了,這么多的資源一次性全部加載,肯定會造成一部分的資源浪費
2.Tornado 主要特點是原生異步非阻塞,在IO密集型應用和多任務處理上占據絕對性的優勢,屬於專注型框架
- Tornado 通常用於API后端應用,游戲服務后台,其內部實現的異步非阻塞真是穩得一批
- Tornado 優點是異步,缺點是干凈,連個Session都不支持
3.Flask 主要特點小而輕,原生組件幾乎為0, 三方提供的組件請參考Django 非常全面,屬於短小精悍型框架
- Flask 通常應用於小型應用和快速構建應用,其強大的三方庫,足以支撐一個大型的Web應用
2.Flask的安裝
pip install Flask
3.Flask的第一個簡單應用
實現一個簡單的web程序:
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頁面展示:
4.Flask中的render_template
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
5.Flask中的redirect重定向
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)
6.Flask中的formdata表單提交
每個框架中都有處理請求的機制(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 的區別就是:
- request.args 是獲取url中的參數
- request.form 是獲取form表單中的參數
7.Flask中的formdata表單的文件傳輸
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>
...
8.Flask的常見錯誤
8.1當你點擊提交出現這樣的錯
解決方案:
@app.route("/login",methods=["GET","POST"])
8.2設置session的時候
解決方法:設置秘鑰
app.secret_key = "sdsfdsgdfgdfgfh"
附加: