Django(part37)--session
學習筆記,僅供參考,有錯必究
文章目錄
- cookies和session
- session
- Django啟用Session
- session的基本操作
- 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 的值到服務器
- 獲取session的值
- 刪除session的值
- 在 settings.py中有關 session 的設置
- 注意事項
當使用session時需要遷移數據庫,否則會出現錯誤,這是因為session看起來是一個字典,但實際上,session需要把它的內容序列化到數據庫中。
python manage.py makemigrations python manage.py migratesession 示例
我們在主視圖模塊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 viewsurlpatterns = [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:
這有點類似于,我們的銀行賬戶被凍結了,但是我們依然保留著該卡號的銀行卡。
總結
以上是生活随笔為你收集整理的Django(part37)--session的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django(part36)--cook
- 下一篇: 使用 Java DB (Derby) 数