本教程擴(kuò)展了我們的LocalLibrary網(wǎng)站,為主頁(yè)添加了一個(gè)基于會(huì)話的訪問(wèn)計(jì)數(shù)器。這是一個(gè)相對(duì)簡(jiǎn)單的例子,但它確實(shí)顯示了,如何使用會(huì)話框架為匿名用戶提供持久的行為。
概覽節(jié)我們?cè)谥暗慕坛讨袆?chuàng)建的LocalLibrary網(wǎng)站,允許用戶瀏覽目錄中的書本和作者。雖然內(nèi)容是從數(shù)據(jù)庫(kù)動(dòng)態(tài)生成的,但每個(gè)用戶在使用站點(diǎn)時(shí),基本上都可以訪問(wèn)相同的頁(yè)面,和相同類型的信息。 在一個(gè) “真實(shí)” 的圖書館中,您可能希望根據(jù)用戶之前對(duì)站點(diǎn)的使用,首選項(xiàng)等,為個(gè)人用戶提供自定義體驗(yàn)。例如,您可以在用戶下次訪問(wèn)時(shí),隱藏上次已經(jīng)確認(rèn)的警告消息。網(wǎng)站,或存儲(chǔ)和尊重他們的偏好(例如,他們希望在每個(gè)頁(yè)面上顯示的搜索結(jié)果的數(shù)量)。
會(huì)話是什么?節(jié)Web瀏覽器和服務(wù)器之間的所有通信,都是通過(guò)HTTP協(xié)議進(jìn)行的,該協(xié)議是無(wú)狀態(tài)的。協(xié)議無(wú)狀態(tài)的事實(shí),意味著客戶端和服務(wù)器之間的消息,完全相互獨(dú)立 - 沒(méi)有基于先前消息的“序列”或行為的概念。因此,如果您想擁有一個(gè)追蹤與客戶的持續(xù)關(guān)系的網(wǎng)站,您需要自己實(shí)現(xiàn)。 會(huì)話是Django(以及大多數(shù)Internet)用于跟蹤站點(diǎn)和特定瀏覽器之間“狀態(tài)”的機(jī)制。會(huì)話允許您為每個(gè)瀏覽器存儲(chǔ)任意數(shù)據(jù),并在瀏覽器連接時(shí),將該數(shù)據(jù)提供給站點(diǎn)。然后,通過(guò)“密鑰”引用與會(huì)話相關(guān)聯(lián)的各個(gè)數(shù)據(jù)項(xiàng),“密鑰”用于存儲(chǔ)和檢索數(shù)據(jù)。 Django使用包含特殊會(huì)話ID的cookie,來(lái)識(shí)別每個(gè)瀏覽器,及其與該站點(diǎn)的關(guān)聯(lián)會(huì)話。默認(rèn)情況下,實(shí)際會(huì)話數(shù)據(jù)存儲(chǔ)在站點(diǎn)數(shù)據(jù)庫(kù)中(這比將數(shù)據(jù)存儲(chǔ)在cookie中更安全,因?yàn)樗鼈兏菀资艿綈阂庥脩舻墓簦D梢詫jango配置為,將會(huì)話數(shù)據(jù)存儲(chǔ)在其他位置(緩存,文件,“安全”cookie),但默認(rèn)位置是一個(gè)良好且相對(duì)安全的選項(xiàng)。 啟用會(huì)話節(jié)我們創(chuàng)建骨架網(wǎng)站時(shí),會(huì)自動(dòng)啟用會(huì)話(在教程2中)。 配置在項(xiàng)目文件(locallibrary / locallibrary / settings.py)的
使用會(huì)話節(jié)您可以從 會(huì)話 下面的代碼片段,顯示了如何使用與當(dāng)前會(huì)話(瀏覽器)關(guān)聯(lián)的密鑰“ 注意: 關(guān)于Django的一個(gè)好處是,你不需要考慮在你的視圖中,將會(huì)話與當(dāng)前請(qǐng)求聯(lián)系起來(lái)的機(jī)制。如果我們?cè)谝晥D中,使用下面的片段,我們就知道有關(guān)
API還提供了許多其他方法,主要用于管理關(guān)聯(lián)的會(huì)話cookie。例如,有一些方法,可以測(cè)試客戶端瀏覽器,是否支持cookie,設(shè)置和檢查cookie過(guò)期日期,以及從數(shù)據(jù)存儲(chǔ)中清除過(guò)期的會(huì)話。您可以在如何使用會(huì)話(Django文檔)中找到完整的API。 保存會(huì)話數(shù)據(jù)節(jié)默認(rèn)情況下,Django僅保存到會(huì)話數(shù)據(jù)庫(kù),并在會(huì)話被修改(分配)或刪除時(shí),將會(huì)話cookie發(fā)送到客戶端。如果您使用會(huì)話密鑰更新某些數(shù)據(jù),如上一節(jié)所示,那么您無(wú)需擔(dān)心這一點(diǎn)!例如:
如果您正在更新會(huì)話數(shù)據(jù)中的某些信息,那么Django將無(wú)法識(shí)別您已對(duì)會(huì)話進(jìn)行了更改并保存了數(shù)據(jù)(例如,如果您要更改“ # Session object not directly modified, only data within the session. Session changes not saved!
request.session['my_car']['wheels'] = 'alloy'
# Set session as modified to force data updates/cookie to be saved.
注意: 您可以通過(guò)將 簡(jiǎn)單的例子 - 獲取訪問(wèn)次數(shù)節(jié)作為一個(gè)簡(jiǎn)單的現(xiàn)實(shí)世界的例子,我們將更新我們的圖書館,告訴當(dāng)前用戶,他們?cè)L問(wèn) LocalLibrary 主頁(yè)的次數(shù)。 打開/locallibrary/catalog/views.py,并在下面以粗體顯示更改。
這里,我們首先得到' 注意: 我們也可能會(huì)測(cè)試瀏覽器中是否支持cookie(請(qǐng)參閱如何使用會(huì)話作為示例),或設(shè)計(jì)我們的UI,以便無(wú)論cookie是否受支持都無(wú)關(guān)緊要。 將以下區(qū)塊底部那一行,添加到主HTML模板(/locallibrary/catalog/templates/index.html)的 “動(dòng)態(tài)內(nèi)容” 部分底部,以顯示上下文變量:
保存更改,并重新啟動(dòng)測(cè)試服務(wù)器。每次刷新頁(yè)面時(shí),數(shù)字都應(yīng)該更新。 總結(jié)節(jié)你現(xiàn)在知道,使用sessions 改善與匿名使用者的互動(dòng),有多么容易了。 在我們的下一篇文章,我們將解釋授權(quán)與許可框架,并演示如何支持使用者帳戶。 參見(jiàn)節(jié)
本教程節(jié)
|
|