Flask:01-三分鐘入門Flask,多一分鐘手把手帶飛
Flask入門
WEB工作原理
- C/S與B/S架構:客戶端-伺服器,瀏覽器-伺服器
- B/S架構工作原理
- 客戶端(瀏覽器) <=> WEB伺服器(nginx) <=> WSGI(uWSGI) <=> Python(Flask) <=> 資料庫(MySQL)
- 說明:flask自帶一個測試的WEB伺服器,但是它僅僅適合於測試環境,不能用於生產環境。
MVC與MTV框架
- MVC框架
- M:Model,模型,即資料模型,負責資料的存取。
- V:View,檢視,負責資料的展示效果。
- C:Controller,控制器,負責業務邏輯的處理。
- MTV框架
- M:Model,模型,即資料模型,負責資料的存取。
- T:Templates,模板,負責資料的展示效果。
- V:View,檢視函式,負責業務邏輯的處理。
- 總結:使用MVC或MTV就是為了解耦,可以提高開發維護的效率。
Flask框架簡介
-
說明:
flask是一個輕量級的web框架,被稱為微型框架。只提供了一個高效穩定的核心,其它全部通過擴充套件來實現。意思就是你可以根據專案需要進行量身定製,也意味著你需要不斷學習相關的擴充套件庫。
-
核心:
- WSGI系統、除錯、路由
- 模板引擎(Jinja2,是flask核心開發者人員開發的)
-
安裝:
pip install flask
啟動完整程式碼
-
完整程式碼
# 匯入類庫 from flask import
-
啟動引數
| 引數 | 說明 || ———— | ———————————————————— || debug | 是否開啟除錯模式,預設為False;開啟後會有出錯除錯資訊,檔案會自動載入。 || threaded | 是否開啟多執行緒,預設為Flase。 || host | 指定主機,預設為’127.0.0.1’,設定為’0.0.0.0’後可以通過IP進位制訪問 || port | 指定埠,預設為5000。 |
啟動示例:app.run(debug=True, threaded=True, host=’0.0.0.0’, port=5555)
flask-script
-
說明:
簡單來說,該庫就是flask終端啟動的引數解析器;這樣就可以不更改程式碼就能完成不同方式的啟動。
-
安裝:
pip install flask-script
-
使用:
# 匯入類庫 from flask_script import Manager # 建立物件 manager = Manager(app) # 啟動應用 if __name__ == '__main__': manager.run()
-
啟動引數:
| 引數 | 說明 || —————- | ———- || -?,—help | 檢視幫助 || -h,—host | 指定主機 || -p,—port | 主動埠 || -d,—debug | 開啟除錯模式 || -r,—reload | 自動載入 || —threaded | 開啟多執行緒 || —processes | 指定多程序數量 |
啟動示例:python manage.py runserver -d -r -h 0.0.0.0 -p 5555
flask使用
-
檢視函式
- 示例:
# 無參路由 @app.route('/') def index(): return '<h1>Hello Flask!</h1>' # 帶參路由,可以傳遞多個引數 @app.route('/welcome/<name>/<uid>/') def welcome(name, uid): return 'Hello {} {}'.format(name, uid) # 指定引數型別,如:str(預設)、int、float、path @app.route('/user/<int:uid>/') def user(uid): return 'Hello {}號'.format(uid) # path型別:型別仍然是str,只是將'/'當做普通字元處理而已 @app.route('/path/<path:p>/') def path(p): return p
- 說明:
1.路由末尾的'/'建議都加上,防止出現路由多敲'/'出現的問題 2.若需要路由引數,引數需要放在<>中,對應的檢視函式需要同名的引數 3.路由引數可以指定多個,也可以指定型別 4.常用引數型別:str(預設)、int、float、path,使用時放在引數前面,使用':'與引數連線 5.path型別其實是str型別,只是將'/'作為普通字元處理罷了。
-
請求(request)
from flask import request # 請求,request中存放了所有的HTTP請求資訊 @app.route('/request/') def req(): # 完整的路由地址 # return request.url # 不包含GET引數的路由地址 # return request.base_url # 只有協議主機和埠 # return request.host_url # 只包含裝飾器中的路由地址 # return request.path # 請求方法的型別:GET、POST # return request.method # 客戶端的IP # return request.remote_addr # args:GET引數;form:POST引數;values:GET和POST # return request.args.get('uid', '預設值') # headers:所有的請求頭資訊 return request.headers.get('User-Agent')
-
響應(response)
from flask import make_response # 響應response @app.route('/response/') def response(): # 直接返回字串 # return 'OK' # 可以在返回時指定狀態碼,預設都是200 # return 'page not found', 404 # 先用專門的函式構造一個響應物件,可以指定內容及狀態碼等 resp = make_response('這是通過函式構造的響應', 404) # 設定響應頭資訊 resp.headers['uid'] = 250 return resp
-
重定向(redirect)
from flask import redirect, url_for # 重定向 @app.route('/old/') def old(): # return '原來的資料' # 通過url來重定向新的路由地址,引數是希望重定向的url # return redirect('/new/') # 根據檢視函式名反向構造路由地址,引數是檢視函式名 # return url_for('new') return redirect(url_for('new')) @app.route('/new/') def new(): return '新的資料'
-
反向構造路由(url_for)
# 反向構造路由 @app.route('/urlfor/') def urlfor(): # 不帶引數的路由 # return url_for('new') # 可以構造帶參的路由,多出來的引數以GET形式傳遞 # return url_for('user', uid=250, name='cuihua') # 構造完整(帶協議主機和埠)路由,可以進行外部跳轉 return url_for('user', uid=250, name='cuihua', _external=True)
-
終止及錯誤定製
# 終止abort @app.route('/abort/') def err(): # 終止程式碼執行,其實是向系統丟擲指定異常 # 系統捕獲異常,按照統一的方案進行處理 abort(404) return '正常' # 定製錯誤顯示 @app.errorhandler(404) def page_not_found(e): return '是不是搞錯了大哥?'
藍本使用
-
說明:
當大量的檢視函式存放在一個檔案中,很明顯是不合適的。最好是根據功能模組進行劃分,將相關的功能模組放在同一檔案,藍本就是用來解決這個問題的。
-
使用:
user.py
# 匯入類庫 from flask import Blueprint, url_for # 建立物件,可以指定統一的字首 user = Blueprint('user', __name__, url_prefix='/user') # 新增檢視函式 @user.route('/login/') def login(): # 當反向構造同一藍本中的路由時,藍本名可以省略,但是不能省略'.' return url_for('.register') return '歡迎登入' @user.route('/register/') def register(): return '歡迎註冊'
-
manage.py
from user import user # 註冊藍本,註冊時可以再次設定相關引數,而且優先順序較高,user:藍本名,url_prefix:路由 app.register_blueprint(user, url_prefix='/u') @app.route('/urlfor/') def urlfor(): # 構造藍本中的路由(藍本中的'/u')時,引數這樣傳遞:'藍本名.檢視函式名' return url_for('user.login')