01-Flask之基本流程

一、Flask簡介

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

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

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

二、流行的Flask

# 流行的主要原因
- 有非常齊全的官方文檔,上手非常方便
- 有非常好的擴展機制和第三方擴展環(huán)境,工作中常見的軟件都會有對應(yīng)的擴展。自己動手實現(xiàn)擴展也是很容易的。
- 社區(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()

  • 運行
python hello.py

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

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

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

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

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

五、插件(擴展庫)

  • flask-script插件(實現(xiàn)命令行參數(shù)接受)
- 安裝插件
    pip install flask-script

- 調(diào)整代碼
    app = Flask(__name__)
    manager = Manager(app)

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

- 命令啟動項目(類似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
    # 主機
    python app.py runserver -h '0.0.0.0'

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

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

六、請求流程

七、項目簡單拆分(藍圖概念)

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

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

  • 藍圖概念
- 藍圖
    宏觀規(guī)劃
- 藍圖是一種規(guī)劃
    主要用來規(guī)劃urls(路由)

  • 藍圖基本使用
- 安裝
    pip install flask-blueprint

- 初始化藍圖
    # 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)用藍圖進行路由注冊
    @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 字符串
    接收的時候也是string,匹配到 / 的時候是匹配結(jié)束
    例如: 
        @blue.route('/getstudent/<string:name>/')
        def getstudent(name):
            print(type(name))
            return '你的名字: %s' % name

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

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

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

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

- int 
    int格式

- float 
    float格式

默認是string類型;

路由參數(shù)名和視圖參數(shù)名必須一致?。?/p>

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

  • 反向解析
- 語法
    url_for()
    url_for("藍圖名.函數(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ù)器在接收到客戶端請求后,會自動創(chuàng)建Request對象,由Flask自動創(chuàng)建,Request對象不可修改。

- request.method   請求方式

- request.path    路由中的路徑

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

- request.form   post請求參數(shù)  
    存儲結(jié)構(gòu)個args一致
    默認是接收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/')
    def get_response():
        return '帶你裝逼帶你飛,帶你走進垃圾堆!',403
- 狀態(tài)碼
    字符串形式直接將狀態(tài)碼添加到return 的第二個參數(shù)
    如果make形勢,直接添加到make的第二個參數(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進行捕獲
- 函數(shù)中要包含一個參數(shù),參數(shù)用來接收異常信息

# 捕獲404異常
@blue.errorhandler(404)
def handler404(exception):
    return '<h1>  我是404我怕誰?。?! </h1>'

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

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

  • Cookie
- 客戶端會話技術(shù),瀏覽器的會話技術(shù)
- 數(shù)據(jù)全都是存儲在客戶端中
- 存儲使用的鍵值對結(jié)構(gòu)進行的存儲(key-value)
- Cookie是通過服務(wù)器創(chuàng)建的Response來創(chuàng)建的
- cookie特性
    支持過期時間
    默認會自動攜帶本網(wǎng)站的所有cookie
    根據(jù)域名進行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ù)端的會話技術(shù)
- 所有數(shù)據(jù)存儲在服務(wù)器中
- 默認存儲在內(nèi)存中
    django默認做了數(shù)據(jù)持久化(存在了數(shù)據(jù)庫中)
- 存儲結(jié)構(gòu)也是key-value形式,鍵值對(其實就是字典)
- 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初始化添加進去即可(app.config['SECRET_KEY'] = '1231231eqwedfaefdf');

  • Token
- 手動實現(xiàn)的session
- 如果在web開發(fā)中沒有cookie,那么token也是不能使用的
- 脫離web前端,Token是可以使用的
    傳輸給客戶端,客戶端保存
    在請求的時候,將token值再傳輸回來

十二、session之持久化存儲

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

flask中session默認存儲在內(nèi)存中;
django中做了持久化,存儲在數(shù)據(jù)庫(可以修改到redis中);
flask中沒有對默認session進行任何處理;
flask-session 可以實現(xiàn)session的數(shù)據(jù)持久化;
redis(緩存在磁盤上的時候,管理磁盤文件使用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()    # 實例化session對象
    sess.init_app(app)  # session對象初始化

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

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

- redis查看值
    # 進入到redis命令行
    redis-cli

    # 查看所有的
    keys *

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

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

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

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

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

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

作者:西門奄
鏈接:http://www.itdecent.cn/u/77035eb804c3
來源:簡書
簡書著作權(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)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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

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