01-Flask之基本流程

一犁珠、Flask簡介

Flask是一個(gè)基于python實(shí)現(xiàn)的web開發(fā)"微"框架艺演。
Flask和Django一樣戴陡,也是一個(gè)基于MVC設(shè)計(jì)模式的web框架。

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

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

二导犹、流行的Flask

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

三、HelloFlask

  • 安裝Flask
pip install flask

  • 編輯文件
# 創(chuàng)建hello.py文件
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello Flask'

app.run()

  • 運(yùn)行
python hello.py

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

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

在啟動(dòng)時(shí)票从,可以在run()中添加參數(shù)

- debug是否開啟調(diào)試模式,開啟后修改python代碼會(huì)自動(dòng)重啟
- threaded是否開啟多線程
- port啟動(dòng)指定服務(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)

- 修改啟動(dòng)方式
    manager.run()

- 命令啟動(dòng)項(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 
    # 自動(dòng)重新加載
    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)建
    from flask import Blueprint
    blue = Blueprint('first', __name__)

    # 在app/__init__.py中注冊
    from flask import Flask
    from App.views import blue
    def createapp():
        app = Flask(__name__)
        app.register_blueprint(blueprint=blue)
        return app

- 調(diào)用藍(lán)圖進(jìn)行路由注冊
    @blue.route('/')
    def hello_world():
        return 'Hello World!'

- 創(chuàng)建app
    # 在manager.py中
    from flask_script import Manager
    from App import createapp

    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 字符串
    接收的時(shí)候也是string,匹配到 / 的時(shí)候是匹配結(jié)束
    例如: 
        @blue.route('/getstudent/<string:name>/')
        def getstudent(name):
            print(type(name))
            return '你的名字: %s' % name

- path 路徑
    接收的時(shí)候也是string,而 / 只會(huì)當(dāng)作字符串中的一個(gè)字符處理

- any 任意一個(gè)
    指的是any中提供的任意一個(gè)她君,類似于SQL查詢中的 in
    例如: @blue.route('/getoption/<any(A,B,C):op>/')后面只能是A,B,C的其中一個(gè)

- uuid 
    uuid格式
    例如: @blue.route('/getuser/<uuid:uu>/')

    # 獲取uuid
    import uuid
    @blue.route('/getuuid/')
    def get_uuid():
        return str(uuid.uuid4())

- int 
    int格式

- float 
    float格式

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

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

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

  • 反向解析
- 語法
    url_for()
    url_for("藍(lán)圖名.函數(shù)名")

- 例如
# 反向解析
@blue.route('/gethello/')
def gethello():
    # 假設(shè)使用app就用app的名稱校镐;反之使用blue就用blue名稱
    # 名稱.函數(shù)名
    # blue = Blueprint('first', __name__)
    p = url_for('first.hello')

    return p

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

九亿扁、視圖之Request請求

服務(wù)器在接收到客戶端請求后,會(huì)自動(dòng)創(chuàng)建Request對象鸟廓,由Flask自動(dòng)創(chuàng)建从祝,Request對象不可修改襟己。

- request.method   請求方式

- request.path    路由中的路徑

- request.args   get請求參數(shù)
    get請求參數(shù)的包裝,args是一個(gè)ImmutableMultiDict對象牍陌,類字典結(jié)構(gòu)對象
    數(shù)據(jù)存儲也是key-value
    外層是大列表擎浴,列表中的元素是元組,元組中左邊是key毒涧,右邊是value

- request.form   post請求參數(shù)  
    存儲結(jié)構(gòu)個(gè)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)建一個(gè)響應(yīng)霹琼,是一個(gè)真正的Response
- Response()創(chuàng)建

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

  • 返回配置
- 內(nèi)容
    直接寫务傲,將內(nèi)容傳遞過去
    @blue.route('/response/')
    def get_response():
        return '帶你裝逼帶你飛,帶你走進(jìn)垃圾堆!',403
- 狀態(tài)碼
    字符串形式直接將狀態(tài)碼添加到return 的第二個(gè)參數(shù)
    如果make形勢枣申,直接添加到make的第二個(gè)參數(shù)上
    # response響應(yīng)3
    @blue.route('/makeresponse/')
    def make_resp():
        resp = make_response('<h2>我很帥!</h2>',300)
        return resp

  • 返回重定向
- redirect 重定向302
- url_for 反向解析

@blue.route('/redirect/')
def make_redir():
    # 固定
    # return redirect('/makeresponse/')
    # 反向解析
    return  redirect(url_for('first.make_resp'))

  • 拋出異常售葡,終止程序執(zhí)行
- abort狀態(tài)碼

@blue.route('/makeabort/')
def make_abort():
    # 拋出異常(4xx  5xx)
    abort(404)
    return '睡著了?'

  • errorhandler
- 異常捕獲
- 可以根據(jù)狀態(tài)或 Exception進(jìn)行捕獲
- 函數(shù)中要包含一個(gè)參數(shù),參數(shù)用來接收異常信息

# 捕獲404異常
@blue.errorhandler(404)
def handler404(exception):
    return '<h1>  我是404我怕誰V姨佟P铩! </h1>'

十一模孩、視圖之會(huì)話技術(shù)

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

  • Cookie
- 客戶端會(huì)話技術(shù)榨咐,瀏覽器的會(huì)話技術(shù)
- 數(shù)據(jù)全都是存儲在客戶端中
- 存儲使用的鍵值對結(jié)構(gòu)進(jìn)行的存儲(key-value)
- Cookie是通過服務(wù)器創(chuàng)建的Response來創(chuàng)建的
- cookie特性
    支持過期時(shí)間
    默認(rèn)會(huì)自動(dòng)攜帶本網(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)
    return respon

  • Session
- 服務(wù)端的會(huì)話技術(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還需要秘鑰種子SECRET_KEY,在app初始化添加進(jìn)去即可(app.config['SECRET_KEY'] = '1231231eqwedfaefdf');

  • Token
- 手動(dòng)實(shí)現(xiàn)的session
- 如果在web開發(fā)中沒有cookie块茁,那么token也是不能使用的
- 脫離web前端齿坷,Token是可以使用的
    傳輸給客戶端,客戶端保存
    在請求的時(shí)候数焊,將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(緩存在磁盤上的時(shí)候悬嗓,管理磁盤文件使用lru, 最近最少使用);

- flask-session安裝
    pip install flask-session

- 需要安裝redis
    pip install redis

- flask-session的配置(初始化完成后,使用和之前session使用一致)
    # app/__init__.py文件中
    from flask_session import Session
    app.config['SECRET_KEY'] = '123qdqwe123113' # 秘鑰
    app.config['SESSION_TYPE'] = 'redis'    # 配置
    sess = Session()    # 實(shí)例化session對象
    sess.init_app(app)  # session對象初始化

    # 簡化操作: sess = Session(app)

- redis連接問題(需要啟動(dòng))
    redis-server

- redis查看值
    # 進(jìn)入到redis命令行
    redis-cli

    # 查看所有的
    keys *

    # 獲取對應(yīng)的值
    get xxxx(key)

    # 獲取時(shí)間(session的生命周期,默認(rèn)31天)
    ttl xxx(key)

    # 刪除對應(yīng)的值
    del xxx(key)

    # 刪除當(dāng)前所有的
    flushdb

- session其他設(shè)置(flask-session同樣適用)
    PERMANENT_SESSION_LIFETIME 設(shè)置超時(shí)時(shí)間
        app.config['PERMANENT_SESSION_LIFETIME'] = 60
    SESSION_COOKIE_NAME 設(shè)置會(huì)話cookie的名稱
        app.config['SESSION_COOKIE_NAME'] = 'flask'

備注: 如果沒有安裝redis-server是啟動(dòng)不了的裕坊。安裝操作: sudo apt install redis

作者:西門奄
鏈接:http://www.reibang.com/u/77035eb804c3
來源:簡書
簡書著作權(quán)歸作者所有包竹,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末籍凝,一起剝皮案震驚了整個(gè)濱河市周瞎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饵蒂,老刑警劉巖声诸,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異退盯,居然都是意外死亡彼乌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門渊迁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慰照,“玉大人,你說我怎么就攤上這事琉朽《咀猓” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵箱叁,是天一觀的道長墅垮。 經(jīng)常有香客問我,道長耕漱,這世上最難降的妖魔是什么算色? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮螟够,結(jié)果婚禮上剃允,老公的妹妹穿的比我還像新娘。我一直安慰自己齐鲤,他們只是感情好斥废,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著给郊,像睡著了一般牡肉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淆九,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天统锤,我揣著相機(jī)與錄音毛俏,去河邊找鬼。 笑死饲窿,一個(gè)胖子當(dāng)著我的面吹牛煌寇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逾雄,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阀溶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸦泳?” 一聲冷哼從身側(cè)響起银锻,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎做鹰,沒想到半個(gè)月后击纬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钾麸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年更振,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饭尝。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡殃饿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芋肠,到底是詐尸還是另有隱情乎芳,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布帖池,位于F島的核電站奈惑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏睡汹。R本人自食惡果不足惜肴甸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望囚巴。 院中可真熱鬧原在,春花似錦、人聲如沸彤叉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秽浇。三九已至浮庐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柬焕,已是汗流浹背审残。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工梭域, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搅轿。 一個(gè)月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓病涨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親璧坟。 傳聞我的和親對象是個(gè)殘疾皇子既穆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一、Flask簡介 Flask是一個(gè)基于python實(shí)現(xiàn)的web開發(fā)"微"框架沸柔。Flask和Django一樣循衰,也是...
    EndEvent閱讀 7,563評論 2 46
  • 一铲敛、Flask簡介 Flask是一個(gè)基于python實(shí)現(xiàn)的web開發(fā)"微"框架褐澎。 Flask和Django一樣,也...
    仙靈兒閱讀 876評論 0 0
  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停伐蒋,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,184評論 22 257
  • flask使用操作指南1 1. flask介紹 Flask是一個(gè)基于Python實(shí)現(xiàn)的web開發(fā)的'微'框架 中文...
    文化銀兒閱讀 17,256評論 4 18
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理工三,服務(wù)發(fā)現(xiàn),斷路器先鱼,智...
    卡卡羅2017閱讀 134,657評論 18 139