1. 程式人生 > >跟我學Flask(六)-狀態保持-上下文物件-指令碼管理器

跟我學Flask(六)-狀態保持-上下文物件-指令碼管理器

一、狀態保持Session和Cookie

  • 因為 http 是一種無狀態協議,瀏覽器請求伺服器是無狀態的。
  • 無狀態:指一次使用者請求時,瀏覽器、伺服器無法知道之前這個使用者做過什麼,每次請求都是一次新的請求。
  • 無狀態原因:瀏覽器與伺服器是使用 socket 套接字進行通訊的,伺服器將請求結果返回給瀏覽器之後,會關閉當前的 socket 連線,而且伺服器也會在處理頁面完畢之後銷燬頁面物件。
  • 有時需要保持下來使用者瀏覽的狀態,比如使用者是否登入過,瀏覽過哪些商品等
  • 實現狀態保持主要有兩種方式:
    • 在客戶端儲存資訊使用Cookie
    • 在伺服器端儲存資訊使用Session
from flask import Flask,make_response,request,session

app = Flask(__name__)
# 設定金鑰
# app.config['SECRET_KEY'] = '6BYWniv8tKE+3jEF+mlJl6YqjNVPpuvSQnO/ey/W6Y89OmpreKWibQ=='
app.config['SECRET_KEY'] = '123'

# 狀態保持:cookie和session,伺服器會記住客戶端資訊。
# cookie:基於鍵值對的字串,伺服器生成cookie資訊,key/value都儲存在瀏覽器中。
# session:基於鍵值對的字串,基於cookie實現,伺服器生成session資訊,key儲存在瀏覽器中,value儲存在伺服器中。 # 設定cookie @app.route('/') def index(): response = make_response('set cookie success') # 設定cookie,並且設定有效期,單位是秒 response.set_cookie('itcast','python18',max_age=3600) # 返回響應 return response # 獲取cookie @app.route('/get'
) def get_cookie(): itcast = request.cookies.get('itcast') return itcast # session設定,一般會儲存在資料庫中,等到學習redis資料庫後,再次設定session。 @app.route('/set_session') def set_session(): # 使用flask內建的session物件 session['itcast'] = 'python18' return 'set session success' if __name__ == '__main__': app.run(debug=True)

二、上下文物件

上下文:相當於一個容器,儲存了 Flask 程式執行過程中的一些資訊。

Flask中有兩種上下文,請求上下文和應用上下文

上下文的應用為了python的多執行緒之間互不影響

請求上下文(request context)

  • request
    • 封裝了HTTP請求的內容,針對的是http請求。舉例:user = request.args.get(‘user’),獲取的是get請求的引數。
  • session
    • 用來記錄請求會話中的資訊,針對的是使用者資訊。舉例:session[‘name’] = user.id,可以記錄使用者資訊。還可以通過session.get(‘name’)獲取使用者資訊。

應用上下文(application context)

  • current_app

應用程式上下文,用於儲存應用程式中的變數,可以通過current_app.name列印當前app的名稱,也可以在current_app中儲存一些變數,例如:

1.應用的啟動指令碼是哪個檔案,啟動時指定了哪些引數

2.載入了哪些配置檔案,匯入了哪些配置

3.連了哪個資料庫

4.有哪些public的工具類、常量

5.應用跑再哪個機器上,IP多少,記憶體多大

current_app.name
current_app.test_value='value'
  • g變數

g 作為 flask 程式全域性的一個臨時變數,充當者中間媒介的作用,我們可以通過它傳遞一些資料,g 儲存的是當前請求的全域性變數,不同的請求會有不同的全域性變數,通過不同的thread id區別

g.name='abc'

注意:不同的請求,會有不同的全域性變數

from flask import Flask,request,current_app,session,g

app = Flask(__name__)

"""
請求上下文物件:request和session
request是Flask框架內建的請求上下文物件;
request常用的屬性:args/form/method/url/headers/cookies/files等

args:查詢字串,url位址列中,?號後面,以=號傳值,以&號分隔的資料。
http://www.baidu.com/?wd=北京天氣

"""

# request的基本用法:args
@app.route('/')
def index():
    # 獲取get請求的查詢字串引數
    # 前端瀏覽器請求的url地址:http://127.0.0.1:5000/?itcast=''
    itcast = request.args.get("itcast")
    age = request.args.get("age")
    # print(itcast)
    # print(age)
    # 輸出請求的url地址
    # print(request.url) # http://127.0.0.1:5000/?itcast=python18&age=18
    # 輸出請求的http請求方法
    # print(request.method) # GET
    # 輸出請求頭
    # print(request.headers)

    return 'hello world'

# form是指表單引數的請求
# get請求引數長度是有限制的,瀏覽器限制;
# post請求引數是沒有限制的。
# http://127.0.0.1:5000/?itcast=

# http://127.0.0.1:5000/form/
@app.route("/form/",methods=['GET','POST'])
def demo_form():
    # 獲取表單引數
    # abc = request.form.get('abc')
    # print(abc)
    # 獲取多個表單引數
    itcast = request.form.get('itcast')
    age = request.form.get('age')
    print(itcast)
    print(age)
    return 'demo form'

# 獲取檔案
@app.route('/files',methods=['POST'])
def save_files():
    # 獲取檔案物件
    image = request.files.get("image")
    # 儲存檔案
    image.save('./666.jpg')

    return 'save files success'

if __name__ == '__main__':
    print(app.url_map)
    app.run(debug=True)

三、指令碼管理器

通過使用Flask-Script擴充套件,我們可以在Flask伺服器啟動的時候,通過命令列的方式傳入引數。而不僅僅通過app.run()方法中傳參,比如我們可以通過:

python hello.py runserver -host ip地址

Flask-Script 還可以為當前應用程式新增指令碼命令

from flask import Flask
# 使用指令碼管理器:可以執行專案,指定ip和port,可以實現資料庫的遷移,新增自定義命令
from flask_script import Manager


app = Flask(__name__)
# 例項化管理器物件,讓管理器和程式例項進行關聯
manage = Manager(app)


@app.route('/')
def index():
    return 'hello world'

if __name__ == '__main__':
    # app.run(debug=True)
    # 使用管理器物件,呼叫run方法,啟動伺服器
    # 可以在終端啟動專案時,手動指定ip和port。
    manage.run()