通過(guò)例子理解Django的session機(jī)制

Django官方文檔寫到:

Django 提供對(duì)匿名會(huì)話(session)的完全支持。這個(gè)會(huì)話框架讓你可以存儲(chǔ)和取回每個(gè)站點(diǎn)訪客任意數(shù)據(jù)。它在服務(wù)器端存儲(chǔ)數(shù)據(jù), 并以cookies的形式進(jìn)行發(fā)送和接受數(shù)據(jù)。

下面通過(guò)例子理解

第一步,啟動(dòng)SESSION

檢查settings.py文件兩個(gè)地方

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions', #第一個(gè)地方,默認(rèn)開(kāi)啟
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware', #第二個(gè)地方,默認(rèn)開(kāi)啟
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

第二步,配置數(shù)據(jù)庫(kù)

同樣是在settings.py文件中

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'accountApp',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': 3306,
    }
}

運(yùn)行遷移,python manage.py migrate
這時(shí),查看數(shù)據(jù)庫(kù)可以看到名為django_session的表。

Snipaste_2019-11-12_20-05-30.png

第三步,編寫視圖函數(shù)和url配置器

# myapp/views.py
def login(request):
        if request.session.get('username', None) == '123456':
            return HTTPResponse('登錄成功')
        else:
            request.session['username'] = '123456'
            return HTTPResponse('請(qǐng)登錄')
# myapp/urls.py
urlpatterns = [
    path('u/login/', views.login),
]

第四步,測(cè)試

我們使用httpie工具訪問(wèn)接口

Snipaste_2019-11-12_20-04-39.png

注意響應(yīng)頭中有Set-Cookie: sessionid=oe5c4tclsvq7pn071jnak7481lgqomdp; expires=Tue, 26 Nov 2019 11:42:13 GMT; Max-Age=1209600; Path=/; SameSite=Lax
再來(lái)看看數(shù)據(jù)庫(kù)中的表**django_session

Snipaste_2019-11-12_19-55-34.png

可以發(fā)現(xiàn)session_key和sessionid是一樣的。

在django中,HttpRequest.session是一個(gè)字典對(duì)象,我們可以對(duì)他多次編輯,django會(huì)自動(dòng)加密并通過(guò)set-cookie響應(yīng)頭返回給瀏覽器,同時(shí)保存到django_session數(shù)據(jù)庫(kù)中。這時(shí),瀏覽器需將set-cookie的內(nèi)容保存到cookie中并在下一次請(qǐng)求發(fā)送給服務(wù)端。

使用httpie工具模擬瀏覽器再一次發(fā)送請(qǐng)求并附帶cookie


Snipaste_2019-11-12_20-03-45.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. URLConf 瀏覽器訪問(wèn)地址由哪個(gè)視圖處理有url決定。創(chuàng)建django項(xiàng)目時(shí),默認(rèn)已在setting.p...
    AdoredU閱讀 661評(píng)論 0 0
  • cookie和session cookie:在網(wǎng)站中,http請(qǐng)求是無(wú)狀態(tài)的。也就是說(shuō)即使第一次和服務(wù)器連接后并且...
    yungege閱讀 394評(píng)論 1 0
  • 7 構(gòu)建在線商店 在上一章中,你創(chuàng)建了關(guān)注系統(tǒng)和用戶活動(dòng)流。你還學(xué)習(xí)了Django信號(hào)是如何工作的,并在項(xiàng)目中集成...
    lakerszhy閱讀 2,081評(píng)論 0 3
  • 轉(zhuǎn)自 :http://blog.csdn.net/taoff/articles/1921009.aspx 一、術(shù)語(yǔ)...
    stone_yao閱讀 6,384評(píng)論 0 31
  • 紀(jì)錄片《幸福定格》曾經(jīng)花7年時(shí)間跟拍8對(duì)夫妻,得出一個(gè)結(jié)論: 所有的婚姻都是一樣的。 都從一段美好浪漫的婚禮開(kāi)始,...
    逸縷塵痕閱讀 227評(píng)論 1 0

友情鏈接更多精彩內(nèi)容