Flask之基本流程

一、Flask簡介

Flask是一個基于python實(shí)現(xiàn)的web開發(fā)"微"框架。

Flask和Django一樣,也是一個基于MVC設(shè)計(jì)模式的web框架。

官方文檔:http://flask.pocoo.org/docs/0.12/中文文檔:http://docs.jinkan.org/docs/flask/

Flask依賴三個庫: Jinja2模板引擎、Werkzeug WSGI工具集、Itsdangerous基于Django的簽名模塊

二、流行的Flask

# 流行的主要原因- 有非常齊全的官方文檔,上手非常方便- 有非常好的擴(kuò)展機(jī)制和第三方擴(kuò)展環(huán)境,工作中常見的軟件都會有對應(yīng)的擴(kuò)展。自己動手實(shí)現(xiàn)擴(kuò)展也是很容易的。- 社區(qū)活躍度非常高- 微型框架的形式給開發(fā)者更大的選擇空間

三、HelloFlask

安裝Flask

pip install flask

編輯文件

# 創(chuàng)建hello.py文件fromflaskimportFlaskapp = Flask(__name__)@app.route('/')defindex():return'Hello Flask'app.run()

運(yùn)行

pythonhello.py

通過pycharm創(chuàng)建flask項(xiàng)目

四、項(xiàng)目啟動參數(shù)配置

在啟動時,可以在run()中添加參數(shù)

-debug是否開啟調(diào)試模式,開啟后修改python代碼會自動重啟-threaded是否開啟多線程-port啟動指定服務(wù)器端口號-host主機(jī),默認(rèn)是127.0.0.1,指定為0.0.0.0代表本機(jī)IP

app.run(debug=True, port=8000, host='0.0.0.0')

五、插件(擴(kuò)展庫)

flask-script插件(實(shí)現(xiàn)命令行參數(shù)接受)

- 安裝插件? ? pip install flask-script- 調(diào)整代碼? ? app = Flask(__name__)? ? manager = Manager(app)- 修改啟動方式? ? manager.run()? ? - 命令啟動項(xiàng)目(類似Django)? ? python app.py runserver -r -d# 查看幫助文檔,有哪些參數(shù)python app.py runserver --help# 端口號python app.py runserver -p 9000# 調(diào)試模式python app.py runserver -d# 自動重新加載python app.py runserver -r# 主機(jī)python app.py runserver -h'0.0.0.0'

插件: 幫助開發(fā)者,快速實(shí)現(xiàn)某種功能

插件使用流程: 下載安裝、初始化配置

六、請求流程

請求流程

七、項(xiàng)目簡單拆分(藍(lán)圖概念)

項(xiàng)目的簡單拆分(類似Django結(jié)構(gòu))

簡單拆分

注意: views.py直接寫是不生效的,需要引入藍(lán)圖來解決這問題

藍(lán)圖概念

- 藍(lán)圖

? ? 宏觀規(guī)劃

- 藍(lán)圖是一種規(guī)劃

? ? 主要用來規(guī)劃urls(路由)

藍(lán)圖基本使用

- 安裝? ? pip install flask-blueprint? ? - 初始化藍(lán)圖# views.py中創(chuàng)建fromflaskimportBlueprint? ? blue = Blueprint('first', __name__)# 在app/__init__.py中注冊fromflaskimportFlaskfromApp.viewsimportbluedefcreateapp():app = Flask(__name__)? ? ? ? app.register_blueprint(blueprint=blue)returnapp- 調(diào)用藍(lán)圖進(jìn)行路由注冊? ? @blue.route('/')defhello_world():return'Hello World!'- 創(chuàng)建app# 在manager.py中fromflask_scriptimportManagerfromAppimportcreateapp? ? app = createapp()? ? manager = Manager(app)if__name__ =='__main__':? ? ? ? manager.run()

八、視圖之路由

路由對應(yīng)視圖函數(shù),并且可以接收參數(shù)。

參數(shù)分類

- 路徑參數(shù)

? ? 位置參數(shù)

? ? 關(guān)鍵字參數(shù)

- 請求參數(shù)

? ? get 參數(shù)在路徑中?之后

? ? post 參數(shù)在請求體中

參數(shù)語法

? ? converter: var_name

參數(shù)類型converter

- string 字符串? ? 接收的時候也是string,匹配到 / 的時候是匹配結(jié)束? ? 例如:? ? ? ? @blue.route('/getstudent//')defgetstudent(name):? ? ? ? ? ? print(type(name))return'你的名字: %s'% name? ? ? ? ? ? - path 路徑? ? 接收的時候也是string,而 / 只會當(dāng)作字符串中的一個字符處理? ? - any 任意一個? ? 指的是any中提供的任意一個,類似于SQL查詢中的in例如: @blue.route('/getoption//')后面只能是A,B,C的其中一個? ? - uuid? ? uuid格式? ? 例如: @blue.route('/getuser//')# 獲取uuidimport uuid? ? @blue.route('/getuuid/')defget_uuid():returnstr(uuid.uuid4())? ? - int? ? int格式? ? - float? ? float格式

默認(rèn)是string類型;

路由參數(shù)名和視圖參數(shù)名必須一致??!

請求方式

-默認(rèn)支持GET,HEAD,OPTIONS-如果想支持某一請求方式,需要自己手動指定? ? @blue.route('/requesttest/', methods=['POST','GET','PUT'])

反向解析

- 語法? ? url_for()? ? url_for("藍(lán)圖名.函數(shù)名")- 例如# 反向解析@blue.route('/gethello/')defgethello():# 假設(shè)使用app就用app的名稱;反之使用blue就用blue名稱# 名稱.函數(shù)名# blue = Blueprint('first', __name__)p = url_for('first.hello')returnp

反向解析即是可以獲取對應(yīng)的路徑

九、視圖之Request請求

服務(wù)器在接收到客戶端請求后,會自動創(chuàng)建Request對象,由Flask自動創(chuàng)建,Request對象不可修改。

- request.method? ? 請求方式- request.path? ? 路由中的路徑- request.args? ? get請求參數(shù)的包裝,args是一個ImmutableMultiDict對象,類字典結(jié)構(gòu)對象? ? 數(shù)據(jù)存儲也是key-value? ? 外層是大列表,列表中的元素是元組,元組中左邊是key,右邊是value- request.form? ? 存儲結(jié)構(gòu)個args一致? ? 默認(rèn)是接收post參數(shù)? ? 還可以接收PUT,PATCH參數(shù)- request.url? ? 完整請求地址- request.base_url? ? 去掉GET參數(shù)的URL- request.remote_addr? ? 請求的客戶端地址- request.file? ? 上傳的文件- request.headers? ? 請求頭- request.cookie? ? 請求中的cookie? ? ? ? ImmutableMultiDict類型? ? ImmutableMultiDict類似字典的數(shù)據(jù)結(jié)構(gòu)? ? 與字典的區(qū)別,可以存在相同的鍵? ? args、form、files都是ImmutableMultiDict的對象ImmutableMultiDict數(shù)據(jù)獲取方式? ? dict['uname']? ? ? ? ? dict.get('uname')# 推薦(在沒有數(shù)據(jù)為空)dict.getlist('uname')# 獲取指定key對應(yīng)的所有值

request、session是內(nèi)置對象(所有路由函數(shù)中都有)!

十、視圖之Response響應(yīng)

服務(wù)器返回給客戶端的數(shù)據(jù)。

Response創(chuàng)建方式

- 直接返回字符串

- render_template 渲染模板,將模板轉(zhuǎn)換成字符串

- make_response 創(chuàng)建一個響應(yīng),是一個真正的Response

- Response()創(chuàng)建

Response由開發(fā)者創(chuàng)建

返回配置

- 內(nèi)容? ? 直接寫,將內(nèi)容傳遞過去? ? @blue.route('/response/')defget_response():return'帶你裝逼帶你飛,帶你走進(jìn)垃圾堆!',403- 狀態(tài)碼? ? 字符串形式直接將狀態(tài)碼添加到return的第二個參數(shù)? ? 如果make形勢,直接添加到make的第二個參數(shù)上# response響應(yīng)3@blue.route('/makeresponse/')defmake_resp():? ? ? ? resp = make_response('

我很帥!

',300)returnresp

返回重定向

- redirect 重定向302- url_for 反向解析? ? @blue.route('/redirect/')defmake_redir():# 固定# return redirect('/makeresponse/')# 反向解析returnredirect(url_for('first.make_resp'))

拋出異常,終止程序執(zhí)行

- abort狀態(tài)碼@blue.route('/makeabort/')defmake_abort():# 拋出異常(4xx? 5xx)abort(404)return'睡著了?'

errorhandler

- 異常捕獲- 可以根據(jù)狀態(tài)或 Exception進(jìn)行捕獲- 函數(shù)中要包含一個參數(shù),參數(shù)用來接收異常信息# 捕獲404異常@blue.errorhandler(404)defhandler404(exception):return'

? 我是404我怕誰?。。?

'

十一、視圖之會話技術(shù)

都是來解決HTTP請求在網(wǎng)絡(luò)開發(fā)中短鏈接的問題,HTTP是無狀態(tài)的。

Cookie

- 客戶端會話技術(shù),瀏覽器的會話技術(shù)- 數(shù)據(jù)全都是存儲在客戶端中- 存儲使用的鍵值對結(jié)構(gòu)進(jìn)行的存儲(key-value)- Cookie是通過服務(wù)器創(chuàng)建的Response來創(chuàng)建的- cookie特性? ? 支持過期時間? ? 默認(rèn)會自動攜帶本網(wǎng)站的所有cookie? ? 根據(jù)域名進(jìn)行cookie存儲? ? 不能跨域名? ? 不能跨瀏覽器? ? - 設(shè)置cookie? ? respon = redirect(url_for('blue.index'))? ? resp.set_cookie('username',username)- 獲取cookie? ? username = request.cookies.get('username','游客')- 刪除cookie? ? resp = redirect(url_for('blue.user_index'))? ? resp.delete_cookie()? ? ? ? 備注:# 模板轉(zhuǎn)為字符串tempstr = render_template('about.html', username=uu)# 模板字符串作為 響應(yīng)對象 參數(shù)respon = make_response(tempstr)returnrespon

Cookie交互流程

Session

- 服務(wù)端的會話技術(shù)- 所有數(shù)據(jù)存儲在服務(wù)器中- 默認(rèn)存儲在內(nèi)存中? ? django默認(rèn)做了數(shù)據(jù)持久化(存在了數(shù)據(jù)庫中)- 存儲結(jié)構(gòu)也是key-value形式,鍵值對(其實(shí)就是字典)- session 是離不開cookie的- 設(shè)置session? ? session['username'] = username- 獲取session? ? username = session.get('username','游客')- 刪除session# 方式一: session是存在cookie中的resp.delete_cookie('session')# 方式二: 直接刪除session中對應(yīng)數(shù)據(jù)session.pop('username')

session交互流程

要使用session還需要秘鑰種子SECRET_KEY,在app初始化添加進(jìn)去即可(app.config['SECRET_KEY'] = '1231231eqwedfaefdf');

Token

- 手動實(shí)現(xiàn)的session

- 如果在web開發(fā)中沒有cookie,那么token也是不能使用的

- 脫離web前端,Token是可以使用的

? ? 傳輸給客戶端,客戶端保存

? ? 在請求的時候,將token值再傳輸回來

十二、session之持久化存儲

flask中這些插件幾乎并沒有干擾到之前的任何邏輯,使用起來非常的方便,就類似于中間件。

flask中session默認(rèn)存儲在內(nèi)存中;django中做了持久化,存儲在數(shù)據(jù)庫(可以修改到redis中);flask中沒有對默認(rèn)session進(jìn)行任何處理;flask-session 可以實(shí)現(xiàn)session的數(shù)據(jù)持久化;redis(緩存在磁盤上的時候,管理磁盤文件使用lru, 最近最少使用);- flask-session安裝? ? pip install flask-session- 需要安裝redis? ? pip install redis? ? - flask-session的配置(初始化完成后,使用和之前session使用一致)# app/__init__.py文件中fromflask_sessionimportSession? ? app.config['SECRET_KEY'] ='123qdqwe123113'# 秘鑰app.config['SESSION_TYPE'] ='redis'# 配置sess = Session()# 實(shí)例化session對象sess.init_app(app)# session對象初始化# 簡化操作: sess = Session(app)- redis連接問題(需要啟動)? ? redis-server? ? - redis查看值# 進(jìn)入到redis命令行redis-cli# 查看所有的keys *# 獲取對應(yīng)的值get xxxx(key)# 獲取時間(session的生命周期,默認(rèn)31天)ttl xxx(key)# 刪除對應(yīng)的值delxxx(key)# 刪除當(dāng)前所有的flushdb? ? - session其他設(shè)置(flask-session同樣適用)? ? PERMANENT_SESSION_LIFETIME 設(shè)置超時時間? ? ? ? app.config['PERMANENT_SESSION_LIFETIME'] =60SESSION_COOKIE_NAME 設(shè)置會話cookie的名稱? ? ? ? app.config['SESSION_COOKIE_NAME'] ='flask'

備注: 如果沒有安裝redis-server是啟動不了的。安裝操作: sudo apt install redis

作者:EndEvent

鏈接:http://m.itdecent.cn/p/de3823b538d2

來源:簡書

簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容