Django(part37)--session

學習筆記,僅供參考,有錯必究




cookies和session


session


session的意思就是會話,session可以在服務器上開闢一段空間,保留瀏覽器和服務器交互時的重要數據(重要數據一定是存儲在服務器上),每個客戶端都可以在服務器端有一個獨立的session

http協議是無狀態的,即每次請求都是一次新的請求,服務器不會記得之前通信的狀態,客戶端與服務器端的一次通信,就是一次新的會話,實現狀態保持的方式就是在客戶端或服務器端存儲與會話有關的數據;

我們推薦使用sesison方式,將所有數據存儲在服務器端在客戶端cookie中存儲session_id

需要注意的是,不同的請求者之間不會共享數據,請求者與響應是一一對應的關係。


Django啓用Session


我們打開settings.py文件,在INSTALLED_APPS列表中添加(如果已經存在就不再添加):

INSTALLED_APPS = [
    # 啓用 sessions 應用
    'django.contrib.sessions',
]

在MIDDLEWARE_CLASSES列表中添加(如果已經存在就不再添加):

MIDDLEWARE = [
    # 啓用 Session 中間層
    'django.contrib.sessions.middleware.SessionMiddleware',
]

session的基本操作


session對象是一個類似於字典的SessionStore對象, 可以用類似於字典的方式進行操作,session只可以存儲能夠序列化的數據,如字典,列表等。


  • 保存 session 的值到服務器
request.session['KEY'] = VALUE
#VALUE爲Python中的基礎數據類型

  • 獲取session的值
VALUE = request.session['KEY']
#或
VALUE = request.session.get('KEY', 缺省值)

  • 刪除session的值
del request.session['KEY']

  • 在 settings.py中有關 session 的設置
SESSION_COOKIE_AGE
#作用:指定session_id在cookies中的保存時長 
#例如:SESSION_COOKIE_AGE = 60*30
SESSION_EXPIRE_AT_BROWSER_CLOSE = True 
#若爲True, 則只要瀏覽器關閉時, session就失效

  • 注意事項

當使用session時需要遷移數據庫,否則會出現錯誤,這是因爲session看起來是一個字典,但實際上,session需要把它的內容序列化到數據庫中。

python manage.py makemigrations
python manage.py migrate

session 示例


我們在主視圖模塊views.py中加入兩個視圖函數:

def test_session(request):
    # 爲session 添加mykey 對應的值
    request.session['mykey'] = ['山羊', '黑山羊']
    return HttpResponse('設置成功')

def show_session(request):
    # 取出sesssion中,mykey對應的數據
    value = request.session.get('mykey', 'mykey沒有對應的值')
    s = str(value)
    return HttpResponse(s)

在主urls.py文件中,加入倆路由:

from django.urls import re_path
from django.contrib import admin
from django.conf.urls import include
from . import views

urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
    re_path(r'^show_session/', views.show_session),
    re_path(r'^test_session/', views.test_session),
]

向http://127.0.0.1:8000/test_session/發起請求:

再向http://127.0.0.1:8000/show_session/發起請求:

當我們關閉瀏覽器,再訪問http://127.0.0.1:8000/show_session/,發現我們的session依然存在,這是因爲session是保存在服務器端,而不是瀏覽器端。

我們打開瀏覽器的開發者工具DevTool,進入Application下的Cookies,可以看到列表中有一個sessionid:

當我們使用自定義視圖函數test_session創建一個session時,瀏覽器會自動創建一個不重複的sessionid,客戶端會拿着這個sessionid在服務器端找到對應的session。

現在,我們刪除這個sessionid,再刷新一下http://127.0.0.1:8000/show_session/,就可以發現找不到session了:

這是因爲,我們刪除sessionid之後,服務器端就不知道我們要的是哪一個session了。


現在,我們向http://127.0.0.1:8000/test_session/發起請求,再創建一個session,並向http://127.0.0.1:8000/show_session/發起請求:

修改視圖函數test_session,準備刪除服務器端的session:

def test_session(request):
    del request.session['mykey']
    return HttpResponse('設置成功')

向http://127.0.0.1:8000/test_session/發起請求,將服務器端的session刪除,並查看http://127.0.0.1:8000/show_session/:

嗯,session已經被刪除了!

但需要注意的是,雖然我們的session在服務器端被刪除了,但是我們的瀏覽器依然保存着sessionid:

這有點類似於,我們的銀行賬戶被凍結了,但是我們依然保留着該卡號的銀行卡。

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