狀態保持-session與cookie

狀態保持

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章