第4天:Django的cookie和session

  • Cookie
  • Session

Cookie

瀏覽器請求服務器是無狀態的,它的每一次請求對於服務器來講都是新的,服務器默認不會保存用戶的狀態數據。但不少時候,服務器須要保存用戶的一些狀態數據,好比用戶是否登陸過,用戶瀏覽過哪些商品等。解決方案,有如下兩種:python

  1. cookie
  2. session

cookie及特色redis

  • Cookie是由服務器(網站)生成的,存儲在瀏覽器端的 鍵值對數據(一般通過加密)
  • 在響應請求時,服務器會把生成 Cookie數據 發給瀏覽器,瀏覽器會自動保存(前提:瀏覽器開啓了cookie功能)
  • 瀏覽器請求服務器(網站)時,會自動上傳該服務器(網站)生成的全部Cookie
  • 每一個網站只能訪問到本身生成的cookie,沒法訪問其它網站(域)生成的cookie

Django中Cookie的保存和讀取數據庫

保存cookie: 經過HttpResponse響應對象的set_cookie方法保存django

response.set_cookie('', '',max_age)

# max_age 有效期,一個整數,單位爲秒,表示在多長時間後失效
# Cookie默認有效期: 若是不指定有效期,或者max_age值爲None,則關閉瀏覽器後Cookie數據就會過時

讀取cookie: 經過HttpRequest請求對象的COOKIES屬性(字典類型)讀取瀏覽器

request.COOKIES['']
# 或者:
request.COOKIES.get('')

案例緩存

需求:服務器

  訪問 http://127.0.0.1:8000/set_cookie 界面時,保存cookie數據cookie

  訪問 http://127.0.0.1:8000/get_cookie 界面時,讀取cookie數據session

實現參考:ide

urlpatterns = [
    ...
    url(r'^set_cookie$', users.views.set_cookie),
    url(r'^get_cookie$', users.views.get_cookie),
]
url配置
...
def set_cookie(request):
    """保存cookie鍵值對數據"""
    response = HttpResponse('保存cookie數據成功')
    response.set_cookie('user_id', 10)
    response.set_cookie('user_name', 'heboan')
    return response


def get_cookie(request):
    """讀取cookie鍵值對數據"""
    user_id = request.COOKIES.get('user_id')
    user_name = request.COOKIES.get('user_name')
    text = 'user_id = {}, user_name = {}'.format(user_id, user_name)
    return HttpResponse(text)
視圖函數配置

 

Seesion

 cookie是在瀏覽器端保存鍵值對數據,而session是在服務器端保存鍵值對數據,重要敏感的數據(銀行卡帳號,密碼等),建議存儲在服務器端,不能經過cookie保存到瀏覽器。session的使用依賴cookie.

session鍵值對數據保存

session數據默認保存在django項目的一張數據庫表中(表名爲:django_session),保存格式以下

  • 不一樣的用戶使用各自不一樣的瀏覽器,能夠認爲:一個瀏覽器表明一個用戶
  • 【重要】表中一條記錄,保存着一個瀏覽器(用戶)全部的session鍵值對數據
  • 【重要】sessionid 是什麼: 瀏覽器標識(用戶標識),表明着一個用戶,經過sessionid 能夠找到該用戶全部的session鍵值對數據

session的使用

Django已經默認開啓了session功能,django封裝了session模塊,用來簡化session數據操做。請參見settings.py 配置文件中session配置

INSTALLED_APPS = [
     ...
     # 默認導入了django自帶的session模塊
     'django.contrib.sessions',
 ]

 MIDDLEWARE = [
     ...
     # 開啓session中間件
     'django.contrib.sessions.middleware.SessionMiddleware',
 ]
settings.py

生成django項目默認的數據庫表

  1. session數據默認保存在django項目的一張數據庫表中(表名爲:django_session)
  2. 在保存session數據庫前,須要先生成django項目默認的數據庫表
  3. 如何生成: 打開終端,並進入到項目根目錄下,再執行如下2個命令生成數據庫表
python manage.py makemigrations
python manage.py migrate

session數據操做

# request.session屬性:類型爲 django.contrib.sessions.backends.db.SessionStore

# 保存session數據(鍵值對)
request.session['']=# 讀取session數據
request.session.get('', 默認值)

# 刪除一個sessoin鍵值對(注意:鍵不存在會報錯 `KeyError`)
del request.session['']

# 清除當前訪問用戶全部的session數據
request.session.flush()  # 刪除一條表記錄
request.session.clear()  # 清空字段中的session鍵值對數據

# 設置session數據有效時間; 若是不設置,默認過時時間爲兩週
request.session.set_expiry(value)
    若是value是一個整數,則 session數據 將在value秒沒有活動後過時
    若是value爲0,則 session數據 將在用戶 關閉瀏覽器時過時
    若是value爲None,則 session數據 將在 2周後過時
session操做

 

本地緩存

存儲在本機內存中,若是丟失則不能找回,比數據庫的方式讀寫更快

SESSION_ENGINE='django.contrib.sessions.backends.cache'

混合存儲

優先從本機內存中存取,若是沒有則從數據庫中存取

SESSION_ENGINE='django.contrib.session.backends.cached_db'

Redis

在redis中保存session,須要引入第三方擴展,咱們可使用django-redis來解決

安裝擴展

pip install django-redis

在settings.py文件中作以下配置

# django-redis
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

在一個視圖中寫入session測試

訪問http://127.0.0.1:8000/users/index

查看Redis

相關文章
相關標籤/搜索