狀態保持
阿新 • • 發佈:2018-12-01
狀態保持
- 因為 http 是一種無狀態協議,瀏覽器請求伺服器是無狀態的。
- 無狀態:指一次使用者請求時,瀏覽器、伺服器無法知道之前這個使用者做過什麼,每次請求都是一次新的請求。
- 無狀態原因:瀏覽器與伺服器是使用 socket 套接字進行通訊的,伺服器將請求結果返回給瀏覽器之後,會關閉當前的 socket 連線,而且伺服器也會在處理頁面完畢之後銷燬頁面物件。
- 有時需要保持下來使用者瀏覽的狀態,比如使用者是否登入過,瀏覽過哪些商品等
- 實現狀態保持主要有兩種方式:
- 在客戶端儲存資訊使用 Cookie
- 在伺服器端儲存資訊使用 Session
無狀態協議:
- 對於事務處理沒有記憶能力
- 對同一個 url 請求沒有上下文關係
- 每次的請求都是獨立的,它的執行情況和結果與前面的請求和之後的請求是無直接關係的,它不會受前面的請求應答情況直接影響,也不會直接影響後面的請求應答情況
- 伺服器中沒有儲存客戶端的狀態,客戶端必須每次帶上自己的狀態去請求伺服器
Cookie
指某些網站為了辨別使用者身份、進行會話跟蹤而儲存在使用者本地的資料(通常經過加密)。
- Cookie最早是網景公司的前僱員Lou Montulli在1993年3月的發明。
- Cookie是由伺服器端生成,傳送給客戶端瀏覽器,瀏覽器會將Cookie的key/value儲存,下次請求同一網站時就傳送該Cookie給伺服器(前提是瀏覽器設定為啟用cookie)。
- Cookie的key/value可以由伺服器端自己定義。
- Cookie基於域名安全,不同域名的Cookie是不能互相訪問的
- 如訪問jd.com時向瀏覽器中寫了Cookie資訊,使用同一瀏覽器訪問baidu.com時,無法訪問到jd.com寫的Cookie資訊
- 瀏覽器的同源策略
- 當瀏覽器請求某網站時,會將本網站下所有Cookie資訊提交給伺服器,所以在request中可以讀取Cookie資訊
- 伺服器可以利用Cookies包含資訊的任意性來篩選並經常性維護這些資訊,以判斷在HTTP傳輸中的狀態。
應用
最典型的應用是判定註冊使用者是否已經登入網站,使用者可能會得到提示,是否在下一次進入此網站時保留使用者資訊以便簡化登入手續,這些都是Cookie的功用。
Flask
設定cookie
可以通過make_response物件中的set_cookie方法來設定cookie。
set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
- max_age 單位為秒,預設為None。
- 如果是臨時cookie,可將max_age設定為None。
from flask imoprt Flask,make_response
@app.route('/cookie')
def set_cookie():
response = make_response('this is to set cookie')
response.set_cookie('username1', 'pig') # 臨時cookie
response.set_cookie('username2', 'pppig', max_age=3600) # 有效期一小時
return response
獲取cookie
from flask import Flask,request
#獲取cookie
@app.route('/request')
def resp_cookie():
resp = request.cookies.get('username1')
return resp
Django
設定cookie
可以通過HttpResponse物件中的set_cookie方法來設定cookie。
set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
- max_age 單位為秒,預設為None。
- 如果是臨時cookie,可將max_age設定為None。
def demo_view(request):
response = HttpResponse('ok')
response.set_cookie('username1', 'pig') # 臨時cookie
response.set_cookie('username2', 'pppig', max_age=3600) # 有效期一小時
return response
獲取cookie
可以通過HttpRequest物件的COOKIES屬性來讀取本次請求攜帶的cookie值。request.COOKIES為字典型別。
def demo_view(request):
cookie1 = request.COOKIES.get('username1')
print(cookie1)
return HttpResponse('OK')
Session
Session:在計算機中,尤其是在網路應用中,稱為“會話控制”。Session 物件儲存特定使用者會話所需的屬性及配置資訊。這樣,當用戶在應用程式的 Web 頁之間跳轉時,儲存在 Session 物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當用戶請求來自應用程式的 Web 頁時,如果該使用者還沒有會話,則 Web 伺服器將自動建立一個 Session 物件。當會話過期或被放棄後,伺服器將終止該會話。Session 物件最常見的一個用法就是儲存使用者的首選項。例如,如果使用者指明不喜歡檢視圖形,就可以將該資訊儲存在 Session 物件中。注意 會話狀態僅在支援 cookie 的瀏覽器中保留。
- Session依賴於Cookie
- 廣義來講: session是一種會話機制, 用於記錄多次http請求之間的關係,關係就是狀態資料,比如登入狀態.
- 狹義來講: session是一種會話資料, 記錄的狀態資料, 比如登入之後記錄的user_id等.
Flask
設定session
實現狀態保持中的session資訊儲存在redis資料庫中
from flask import Flask,session
# 使用flask_session擴充套件包
from flask_session import Session
from redis import StrictRedis
app = Flask(__name__)
# 設定金鑰
app.config['SECRET_KEY'] = 'asdlkfjasl;dkfjqelfhelwqkt23l45j'
# 使用Session類的配置資訊
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = StrictRedis(host='127.0.0.1',port=6379)
app.config['SESSION_USE_SIGNER'] = True
# 使用Flask預設的config配置物件中的session有效期
app.config['PERMANENT_SESSION_LIFETIME'] = 3600 # 秒
# 使用Session類和程式例項進行關聯
Session(app)
@app.route('/')
def index():
# 設定session
session['year'] = '2019'
return 'hello world'
if __name__ == '__main__':
app.run(debug=True)
獲取session
session.get('year')
Django
在redis中儲存session,需要引入第三方擴充套件,我們可以使用django-redis來解決。
pip install django-redis
在settings.py檔案中做如下設定
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
# 定義django中redis的位置
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
# django使用redis的預設客戶端來進行操作.
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 我們定義一個cache(本地快取來儲存資訊,cahe指定的是redis)
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 本地的session使用的本地快取名稱是'default', 這個名稱就是上面我們配置的caches的名
# 稱"default"
SESSION_CACHE_ALIAS = "default"
設定session
def set_session(request):
request.session['one'] = '1'
request.session['two'] = '2'
return HttpResponse('儲存session資料成功')
設定session有效期
request.session.set_expiry(value)
- 如果value是一個整數,session將在value秒沒有活動後過期。
- 如果value為0,那麼使用者session的Cookie將在使用者的瀏覽器關閉時過期。
- 如果value為None,那麼session有效期將採用系統預設值,預設為兩週,可以通過在settings.py中設定SESSION_COOKIE_AGE來設定全域性預設值。其中 SESSION_COOKIE_AGE的單位是以秒為單位的.
獲取session
def get_session(request):
one = request.session.get('one')
two = request.session.get('two')
text = 'one=%s, two=%s' % (one,two)
return HttpResponse(text)
以上內容僅供參考 -_- …為作者邊學習,邊摘抄和總計的內容