帶你入門輕量級框架——Flask

閱讀提示

本文將詳細介紹Python中的輕量級框架———Flask

一、flask入門

WEB工作原理

  1. C/S 客戶端/服務器端
  2. B/S 瀏覽器/服務器端

倆大核心

  1. werkzeug

    實現路由、調試和web服務的網關接口

  2. jinjia2

    實現了模板

簡介:

flask 是一個python微型框架 只提供了一個強健的核心 其它功能都需要通過第三方擴展庫來實現

安裝

pip install flask

完整啓動的代碼

from flask import Flask
app = Flask(__name__)

# 路由  別人訪問你的地址  http://www.baidu.com/a/b
@app.route('/')
def index():
    print('訪問到我了')
    # 響應
    return '訪問到我了'

# 判斷只能在主文件中文件flask項目
if __name__ == '__main__':
    # 運行flask
    app.run()

啓動地址

http://127.0.0.1:5000

http://127.0.0.1:5000/

run啓動參數

參數 說明
debug 是否開啓調試模式 默認爲false 開啓會自動加載代碼 和顯示錯誤信息
threaded 是否開啓多線程 默認是不開啓的
port 端口號 默認5000
host 主機 默認127.0.0.1

完整的啓動

app.run(host=‘0.0.0.0’,port=‘5001’,debug=True,threaded=True)

正常本地調試使用的時候 只需要開啓debug就可以 如果發生端口衝突 則開啓port

app.run(debug=True)

二、視圖函數

(1) 無參路由(沒有參數的路由地址)

實例

@app.route('/')
def index():
    # 響應
    return '訪問到我了'

(2) 帶一個參數的路由

格式

/路由名稱/<參數名>/

實例

@app.route('/welcome/<name>/')
def welcome(name):
    return 'welcome {}'.format(name)

訪問

http://127.0.0.1/5000/lucky/

(3) 帶多個參數的路由

@app.route('/info/<name>/<age>/')
@app.route('/info/<name>_<age>/')
def info(name,age):
    return '我叫:{} 我今年:{}歲了'.format(name,age)

訪問:

http://127.0.0.1/5000/lucky/18/

http://127.0.0.1/5000/lucky_18/

(4) 限制路由參數的訪問類型

通過 path、string、int、float進行限制

實例

@app.route('/welcome/<arg>/')
@app.route('/welcome/<string:arg>/')  值的類型爲字符串 默認就是string
@app.route('/welcome/<int:arg>/')  值的類型必須爲整形
@app.route('/welcome/<float:arg>/') 值的類型必須爲浮點型
@app.route('/welcome/<path:arg>/') 值的類型因爲字符串 只是/分隔符 不再認爲是分隔符 而是值的一部分
def welcome(arg):
    print(type(arg))
    return 'welcome {}'.format(arg)

注意:

  1. 一個視圖函數 是可以有多個路由名稱
  2. 路由結尾的/建議加上 否則會多一次重定向 如果在定義的時候路由結尾沒有/ 那麼在訪問的 時候 路由就不能有 / 否則 404
  3. 參數值的類型默認都爲 字符串!!!

三、重定向 redirect

作用:

可以直接通過瀏覽器跳轉到另外一個地址(視圖函數直接的跳轉)

導入:

from flask import redirect,url_for

  • redirect 通過給定參數路由地址 進行跳轉
  • url_for 通過視圖函數名稱 反向構造出路由地址

redirect的使用
實例

# 使用redirect
@app.route('/redirect/')
def my_redirect():
#     去首頁 無參路由
    return redirect('/')
#     帶一個參數的路由地址的重定向
    return redirect('/arg/lucky/')
#      帶多個參數的路由地址的重定向
    return redirect('/args/lucky/18/')

url_for的使用

實例

# 使用url_for 的視圖函數
@app.route('/url_for/')
def my_urlfor():
    # 構造首頁路由
    print(url_for('index'))  # /
    # 給url_for 一個帶參的視圖函數 但是沒給參數  會報錯werkzeug.routing.BuildError: Could not build url for endpoint 'arg'. Did you forget to specify values ['name']?
    print(url_for('arg'))
    # 帶一個參數  給參數
    print(url_for('arg',name='lucky')) #/arg/lucky/
    # 帶多個參數的視圖函數
    # werkzeug.routing.BuildError: Could not build url for endpoint 'args'. Did you forget to specify values ['age', 'name']?
    print(url_for('args'))
    # 帶參數
    print(url_for('args',name='lucky',age=18)) #/args/lucky/18/
    return 'url_for'

redirect和url_for的組合使用

實例

# redirect 和 url_for的組合使用
@app.route('/ru/')
def ru():
    # 去首頁
    return redirect(url_for('index'))
    # 去一個參數的路由地址
    return redirect(url_for('arg',name='lucky'))
    # 去多個參數的路由地址
    return redirect(url_for('args',name='lucky',age=18))

四、abort(終止)

導入

from flask import abort

類似python中的raise

上方的代碼正常執行 下面的代碼不在執行

raise 拋出的錯誤名稱

abort拋出的http狀態碼

實例

from flask import abort 
@app.route('/test_abort/')
def test_abort():
    print('abort上方')
    abort(500)
    print('abort下方')
    return '測試abort的視圖函數'

五、捕獲錯誤

實例

# 捕獲狀態所對應的錯誤
# 參數 err 是當前捕獲狀態碼的錯誤信息
@app.errorhandler(500)
def server_error(err):
    print(err)
    return '你報500的錯誤了!!!'

@app.errorhandler(404)
def page_not_founde(err):
    print('404了!')
    return '404'

六、請求 request

作用:

獲取請求報文中 傳遞的數據

概述:

瀏覽器發送到服務器的所有報文被flask接收以後 會創建出request請求對象 request被用於視圖函數中 用來獲取請求的數據

導入:

from flask import request

request常用屬性

  1. url 完整的請求 url
  2. base_url 去掉get傳參的url
  3. host_url 只有主機IP和端口號的url地址
  4. host 主機和端口
  5. path 路由地址
  6. method 請求的方法
  7. remote_addr 獲取客戶端請求的ip地址
  8. args 獲取get傳參的參數
  9. form 存儲form表單傳遞過來的數據
  10. files 獲取文件上傳
  11. headers 獲取請求頭信息
  12. cookies 獲取請求的cookie
  13. json 獲取請求過來的json數據

實例

# 請求對象 request的使用
# http://127.0.0.1:5000/request/?name=lucky&age=18#name
@app.route('/request/')
def r():
    print(request.url)
    print(request.base_url)
    print(request.host_url)
    print(request.host)
    print(request.path)
    print(request.method)
    print(request.remote_addr)
    print(request.args['name'])
    print(request.args['age'])
    print(request.args.get('name'))
    print(request.args.get('age'))
    print(request.headers.get('User-Agent'))
    return 'request請求對象'

七、響應 response

(1) 直接響應字符串數據

實例

@app.route('/')
def index():
    # 只相應內容
    return 'index'
    # 響應內容和狀態碼
    return 'index',404

(2) 通過make_response來構造響應

from flask import make_response

實例

@app.route('/')
def index():
    # 手動構造響應
    res = make_response('響應內容')
    # 響應內容和狀態碼
    res = make_response('響應內容',404)
    return res

八、current_app

導入

from flask import current_app

概述

current_app 是當前app對象的一個代理對象 用於獲取實際的app對象和app上的配置信息

實例

# current_app的使用
@app.route('/test_current_app/')
def test_current_app():
    print(current_app.config['SECRET_KEY'])
    return 'test_current_app'

九、會話控制 cookie 的使用

概述

會話控制 用來保持用戶的狀態

原因:

http協議 是無狀態協議 每一次連接都是一個新的會話

cookie值的存儲

cookie存儲在客戶端的瀏覽器一般會限制存儲cookie的個數爲 20個 並且單個cookie保存值的大小不能超過4kb

存儲在瀏覽器上爲明文存儲 所有不安全

(1) 設置cookie

response.set_cookie(key,value,max_age=None,expires=None,path=’/’)

實例

# 設置cookie
@app.route('/set_cookie/')
def set_cookie():
    res = make_response('設置cookie')
    res.set_cookie('name','lucky')
    return res

默認存活時間爲瀏覽會話結束

意思就是關閉瀏覽器時 就結束(切記 不是關閉標籤頁)

(2) 獲取cookie

實例

# 獲取cookie
@app.route('/get_cookie/')
def get_cookie():
    val = request.cookies.get('name','值不存在')  #若有值 則顯示,若沒有 則顯示值不存在
    return val

(3) 刪除cookie

實例

# 刪除 cookie
@app.route('/delete_cookie/')
def delete_cookie():
    res = make_response('刪除cookie')
    res.delete_cookie('name')
    return res

(4) 設置cookie並設置過期時間

實例

# 設置cookie並設置過期時間
@app.route('/set_cookie_expires/')
def set_cookie_expires():
    res = make_response('設置cookie並設置過期時間')
    # 設置cookie存活時間爲 1分鐘
    # res.set_cookie('name','lucky',max_age=60)
    left_time = time.time()+60
    res.set_cookie('name','lucky',expires=left_time)
    return res

十、會話控制session的使用

服務器需要識別同一個訪問者的請求 主要是通過瀏覽器中的cookie實現的 訪問者在第一次訪問服務器的時候 會在瀏覽器的cookie中 存儲一個唯一sessionid值 通過這個唯一id值區分不同的訪問者的請求

session基於cookie

注意:

設置session 需要添加 secret_key 祕鑰 進行sessionid加密生成的字符串

設置secret_key的方法

app.secret_key = 'lucky'
app.config['SECRET_KEY'] = 'lucky'

導入

from flask import session

(1) 設置session

# 設置session
@app.route('/set_session/')
def set_session():
    session['name'] = 'lucky'
    return '設置session'

(2) 獲取session

# 獲取session
@app.route('/get_session/')
def get_session():
    val = session.get('name','沒有值')
    return 'session的值爲:{}'.format(val)

(3) 刪除session

# 刪除session
@app.route('/delete_session/')
def delete_session():
    # 刪除某個key的session值
    # session.pop('name')
    # 清除所有session
    session.clear()
    return 'session的key爲name的值被刪除'

(4) 設置session並設置過期時間

# 設置session並設置過期時間
@app.route('/set_session_leftime/')
def set_session_leftime():
    # 開啓session持久化存儲
    session.permanent = True
    # timedelta是一個計算時間差值的模塊
    app.permanent_session_lifetime = timedelta(minutes=1)
    session['name'] = 'lucky'
    return '設置session並設置過期時間'

區別:

  1. cookie數據存儲在瀏覽器上 session存儲在服務器上
  2. cookie 沒有session安全
  3. session會在一定時間內保存在服務器上 當訪問增多 會加大服務器的壓力 考慮性能優化 存儲在cookie上
  4. 個人建議 將登陸等重要的數據 存儲在sessino上 其它的建議存儲在cookie上

十一、flask擴展庫 flask-script

概述:

flask終端運行解析器

安裝:

pip install flask-script

使用

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)
	...
if __name__ == '__main__':
    manager.run()

啓動項參數:

獲取啓動項參數:

python 文件名.py runserver -?

完整啓動

python manager.py runserver -h0.0.0.0 -p5001 -d -r

正常啓動

python manage.py runserver -d -r

十二、藍本 blueprint

概述

當我們代碼越來越複雜的時候 很明顯將所有視圖函數 放在一個文件中 是不合理的 要按照功能進行視圖函數的劃分

使用 user.py

# user.py 就是所有處理用戶的視圖函數的py文件
# 導入藍本文件
from flask import Blueprint
user = Blueprint('user',__name__)

@user.route('/login/')
def login():
    return '登錄'

@user.route('/logout/')
def logout():
    return '退出登錄'

manager.py

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)

@app.route('/')
def index():
    return 'index'
# 從user藍本文件 導入user藍本對象
from user import user
# 註冊藍本
# app.register_blueprint(user)
app.register_blueprint(user,url_prefix='/user')
if __name__ == '__main__':
    manager.run()

訪問

http://127.0.0.1:5000/login/

http://127.0.0.1:5000/user/login/

注意

藍本之間的重定向 需要告訴url_for 是哪個藍本文件的視圖函數名 否則報錯

@app.route('/')
def index():
    # index視圖 去 user.py藍本
    # return redirect('/user/login/')
    # 配合 url_for 需要注意 告訴人家 是哪個藍本文件的視圖函數
    return redirect(url_for('user.login'))

擴展

web框架

其他語言

M model 模型 操作數據庫

V view 視圖 負責展示模板給用戶看的

C controller 控制器 進行邏輯功能與模型和視圖的交互

python中

M model 模型 操作數據庫

V view 視圖 進行邏輯功能與模型和視圖的交互

T templates 模板 負責展示模板給用戶看的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章