1. 程式人生 > >狀態保持

狀態保持

狀態保持

  • 因為 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)

以上內容僅供參考 -_- …為作者邊學習,邊摘抄和總計的內容