前言
Python Web框架里比較有名當(dāng)屬Django,Django功能全面,它提供一站式解決方案,集成了MVT(Model-View-Template)和ORM,以及后臺管理。但是缺點也很明顯,它偏重。就像是一個裝潢好的房子,它提供好了你要用的東西,直接拿來用就可以。
Flask相對于Django而言是輕量級的Web框架。和Django不同,F(xiàn)lask輕巧、簡潔,通過定制第三方擴展來實現(xiàn)具體功能。
可定制性,通過擴展增加其功能,這是Flask最重要的特點。Flask的兩個主要核心應(yīng)用是Werkzeug和模板引擎Jinja。
WSGI
Web Server Gateway Interface(Web服務(wù)器網(wǎng)關(guān)接口,WSGI)已被用作Python Web應(yīng)用程序開發(fā)的標(biāo)準(zhǔn)。 WSGI是Web服務(wù)器和Web應(yīng)用程序之間通用接口的規(guī)范。
Werkzeug
它是一個WSGI工具包,它實現(xiàn)了請求,響應(yīng)對象和實用函數(shù)。這使得能夠在其上構(gòu)建web框架。 Flask框架使用Werkzeug作為其基礎(chǔ)之一。
jinja2
jinja2是Python的一個流行的模板引擎。Web模板系統(tǒng)將模板與特定數(shù)據(jù)源組合以呈現(xiàn)動態(tài)網(wǎng)頁。
Flask通常被稱為微框架。 它旨在保持應(yīng)用程序的核心簡單且可擴展。Flask沒有用于數(shù)據(jù)庫處理的內(nèi)置抽象層,也沒有形成驗證支持。相反,F(xiàn)lask支持?jǐn)U展以向應(yīng)用程序添加此類功能。一些受歡迎的Flask擴展將在本教程后續(xù)章節(jié)進行討論。
Flask工作流程圖
Flask擴展包:
- Flask-SQLalchemy:操作數(shù)據(jù)庫
- Flask-migrate:管理遷移數(shù)據(jù)庫
- Flask-Mail:郵件
- Flask-WTF:表單
- Flask-script:插入腳本
- Flask-Login:認(rèn)證用戶狀態(tài)
- Flask-RESTful:開發(fā)REST API的工具
- Flask-Bootstrap:集成前端Twitter Bootstrap框架
- Flask-Moment:本地化日期和時間
新建flask項目:
建成如下:
運行如下:
必須在項目中導(dǎo)入Flask模塊。 Flask類的一個對象是我們的WSGI應(yīng)用程序。
Flask構(gòu)造函數(shù)使用當(dāng)前模塊(__name __)的名稱作為參數(shù)。
以下是實例化一個Flask對象可填的參數(shù),及其默認(rèn)值:
- template_folder:模板所在文件夾的名字, 默認(rèn)就是templates
- root_path:可以不用填,會自動找到,當(dāng)前執(zhí)行文件,所在目錄地址在return render_template時會將上面兩個進行拼接,找到對應(yīng)的模板地址
- static_folder:靜態(tài)文件所在文件的名字,默認(rèn)是static,可以不用填
- static_url_path:靜態(tài)文件的地址前綴,寫成什么,訪問靜態(tài)文件時,就要在前面加上這個
instance_path和instance_relative_config是配合來用的、這兩個參數(shù)是用來找配置文件的,當(dāng)用App.config.from_pyfile('settings.py')這種方式導(dǎo)入配置文件的時候會用到
- instance_relative_config:默認(rèn)為False,當(dāng)設(shè)置為True時,from_pyfile會從instance_path指定的地址下查找文件。
- instsnce_path:指定from_pyfile查詢文件的路徑,不設(shè)置時,默認(rèn)尋找和app.run()的執(zhí)行文件同級目錄下的instance文件夾,如果配置了instance_path(注意需要是絕對路徑),就會從指定的地址下里面的文件
Flask類的route()函數(shù)是一個裝飾器,它告訴應(yīng)用程序哪個URL應(yīng)該調(diào)用相關(guān)的函數(shù)。
app.route(rule, options)
- rule 參數(shù)表示與該函數(shù)的URL綁定。
- options 是要轉(zhuǎn)發(fā)給基礎(chǔ)Rule對象的參數(shù)列表。
在上面的示例中,'/ ' URL與hello_world()函數(shù)綁定。因此,當(dāng)在瀏覽器中打開web服務(wù)器的主頁時,將呈現(xiàn)該函數(shù)的輸出。
application對象的add_url_rule()函數(shù)也可用于將URL與函數(shù)綁定,如下:
def hello_world():
return ‘hello world’
app.add_url_rule(‘/’, ‘hello’,hello_world)
最后,F(xiàn)lask類的run()方法在本地開發(fā)服務(wù)器上運行應(yīng)用程序。
app.run(host, port, debug, options)
- host:監(jiān)聽的主機名
- post:監(jiān)聽的主機端口,默認(rèn)5000
- debug:調(diào)試模式,默認(rèn)false,設(shè)置為frue則顯示調(diào)試信息
- options:要轉(zhuǎn)發(fā)到底層的werkzeng服務(wù)器
給路由傳參示例:
from flask importFlask
app = Flask(__name__)
@app.route('/id/<int:idn>')def hello_world(idn):
return 'HelloWorld! %d' %idn
if __name__ == '__main__':
app.run()
路由傳遞的參數(shù)默認(rèn)當(dāng)做string處理,這里指定int,還支持float,path,尖括號中冒號后面的內(nèi)容是動態(tài)的。
效果如下:
返回狀態(tài)碼示例:
abort函數(shù):
如果在視圖函數(shù)執(zhí)行過程中,出現(xiàn)了異常錯誤,我們可以使用abort函數(shù)立即終止視圖函數(shù)的執(zhí)行。通過abort函數(shù),可以向前端返回一個http標(biāo)準(zhǔn)中存在的錯誤狀態(tài)碼,表示出現(xiàn)的錯誤信息。
使用abort拋出一個http標(biāo)準(zhǔn)中不存在的自定義的狀態(tài)碼,沒有實際意義。如果abort函數(shù)被觸發(fā),其后面的語句將不會執(zhí)行。其類似于python中raise。
from flask importFlask,abort
app = Flask(__name__)
@app.route('/id/<int:idn>')def hello_world(idn):
abort(403)
return 'HelloWorld! %d' %idn, 888
if __name__ == '__main__':
app.run()
在Flask中通過裝飾器來實現(xiàn)捕獲異常,errorhandler()接收的參數(shù)為異常狀態(tài)碼。視圖函數(shù)的參數(shù),返回的是錯誤信息。
重定向redirect示例:
from flask importFlask,redirect
app = Flask(__name__)
@app.route('/')def hello_world():
return redirect('https://www.baidu.com')
if __name__ == '__main__':
app.run()
效果如下:
這里再介紹一下url_for(),url_for()函數(shù)對于動態(tài)構(gòu)建特定函數(shù)的URL非常有用。該函數(shù)接受函數(shù)的名稱作為第一個參數(shù),以及一個或多個關(guān)鍵字參數(shù),每個參數(shù)對應(yīng)于URL的變量部分。
如下:
@app.route('/user/<name>')def hello_user(name):
if name=='admin':
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guest',guest =name))
HTTP方法:
Http協(xié)議是萬維網(wǎng)中數(shù)據(jù)通信的基礎(chǔ)。在該協(xié)議中定義了從指定URL檢索數(shù)據(jù)的不同方法。
方法介紹:
- GET:以未加密的形式將數(shù)據(jù)發(fā)送到服務(wù)器獲取響應(yīng)內(nèi)容
- POST: 用于將html表單數(shù)據(jù)上傳到服務(wù)器
- PUT:用上傳的內(nèi)容替換目標(biāo)資源的數(shù)據(jù)
- DELETE:刪除由URL給出的目標(biāo)資源的數(shù)據(jù)
- HEAD: 和GET方法相同,但沒響應(yīng)體
默認(rèn)情況下,F(xiàn)lask路由響應(yīng)GET請求。但是,可以通過為route()裝飾器提供方法參數(shù)來更改此首選項。
為了演示在URL路由中使用POST方法,首先讓我們創(chuàng)建一個HTML表單,并使用POST方法將表單數(shù)據(jù)發(fā)送到URL。
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action = "http://localhost:5000/login"method = "post">
<p>Enter Name:</p>
<p><input type = "text" name = "nm"/></p>
<p><input type = "submit" value = "submit"/></p>
</form>
</body>
</html>
loginok.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello {{ name }}</h1>
</body>
</html>
WC_public_flask.py
from flask importFlask, render_template, request
app = Flask(__name__, template_folder='templates')
@app.route('/')def login():
return render_template('login.html')
@app.route('/login',methods = ['POST', 'GET'])def loginok():
if request.method== 'POST':
user = request.form['nm']
return render_template('loginok.html',name =user)
else:
user = request.args.get('nm')
return render_template('loginok.html',name =user)
if __name__ == '__main__':
app.run(debug = True)






