跟我學Flask(六)-狀態保持-上下文物件-指令碼管理器
阿新 • • 發佈:2018-11-17
一、狀態保持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()