瀏覽器請求服務器是無狀態的,它的每一次請求對於服務器來講都是新的,服務器默認不會保存用戶的狀態數據。但不少時候,服務器須要保存用戶的一些狀態數據,好比用戶是否登陸過,用戶瀏覽過哪些商品等。解決方案,有如下兩種:python
cookie及特色redis
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), ]
... 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)
cookie是在瀏覽器端保存鍵值對數據,而session是在服務器端保存鍵值對數據,重要敏感的數據(銀行卡帳號,密碼等),建議存儲在服務器端,不能經過cookie保存到瀏覽器。session的使用依賴cookie.
session鍵值對數據保存
session數據默認保存在django項目的一張數據庫表中(表名爲:django_session),保存格式以下
session的使用
Django已經默認開啓了session功能,django封裝了session
模塊,用來簡化session
數據操做。請參見settings.py
配置文件中session配置
INSTALLED_APPS = [ ... # 默認導入了django自帶的session模塊 'django.contrib.sessions', ] MIDDLEWARE = [ ... # 開啓session中間件 'django.contrib.sessions.middleware.SessionMiddleware', ]
生成django項目默認的數據庫表
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_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