狀態保持
- 因爲 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)
以上內容僅供參考 -_- …爲作者邊學習,邊摘抄和總計的內容