Django Tutorial Part 7: Sessions framework

2018-05-15 17:26 更新
先決條件: 完成之前的所有教學(xué)主題,包括 Django教程第6部分:通用列表和詳細(xì)信息視圖
目的: 了解如何使用會話。

概述

我們在前面的教程中創(chuàng)建的 LocalLibrary 網(wǎng)站允許用戶瀏覽圖書 和作者在目錄中。 雖然內(nèi)容是從數(shù)據(jù)庫動態(tài)生成的,但是當(dāng)用戶使用站點時,每個用戶基本上都可以訪問相同的頁面和類型的信息。

在"真實"庫中,您可能希望根據(jù)用戶以前對網(wǎng)站,偏好設(shè)置等的使用情況為個別用戶提供自定義體驗。例如,您可以隱藏用戶以前在下次訪問時所確認(rèn)的警告消息 站點或存儲并尊重他們的偏好(例如他們希望在每一頁上顯示的搜索結(jié)果的數(shù)量)。

會話框架允許您實現(xiàn)此類行為,允許您在每個站點訪問者的基礎(chǔ)上存儲和檢索任意數(shù)據(jù)。

什么是會話?

網(wǎng)絡(luò)瀏覽器和服務(wù)器之間的所有通信都是通過HTTP協(xié)議進(jìn)行的,這是無狀態(tài) 協(xié)議是無狀態(tài)的意味著客戶端和服務(wù)器之間的消息彼此完全獨(dú)立 - 沒有基于先前消息的"序列"或行為的概念。 因此,如果你想有一個網(wǎng)站跟蹤與客戶端的持續(xù)關(guān)系,你需要自己實現(xiàn)。

會話是Django(和大多數(shù)Internet)用于跟蹤站點和特定瀏覽器之間的"狀態(tài)"的機(jī)制。 會話允許您為每個瀏覽器存儲任意數(shù)據(jù),并在瀏覽器連接時將此數(shù)據(jù)提供給網(wǎng)站。 與會話相關(guān)聯(lián)的各個數(shù)據(jù)項然后由"密鑰"引用,"密鑰"用于存儲和檢索數(shù)據(jù)。

Django使用包含特殊會話ID 的cookie來標(biāo)識每個瀏覽器及其與網(wǎng)站的關(guān)聯(lián)會話。 實際的會話數(shù)據(jù)在默認(rèn)情況下存儲在站點數(shù)據(jù)庫中(這比將數(shù)據(jù)存儲在cookie中更安全,在cookie中它們更容易受到惡意用戶的攻擊)。 您可以配置Django將會話數(shù)據(jù)存儲在其他位置(緩存,文件,"安全"Cookie),但默認(rèn)位置是一個良好的和相對安全的選項。

啟用會話

當(dāng)我們創(chuàng)建骨架網(wǎng)站(在教程2中)時,會話自動啟用。

配置在項目文件( locallibrary / locallibrary / settings.py )的 INSTALLED_APPS MIDDLEWARE 部分中設(shè)置,如下所示:

INSTALLED_APPS = [
    ...
    'django.contrib.sessions',
    ....

MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    ....

使用會話

您可以從視圖中訪問 request 參數(shù)(作為視圖的第一個參數(shù)傳遞的 HttpRequest )訪問 session 屬性。 此會話屬性表示與當(dāng)前用戶的特定連接(或更準(zhǔn)確地說,與當(dāng)前瀏覽器的連接,如本網(wǎng)站的瀏覽器Cookie中的會話ID所標(biāo)識)。

session 屬性是一個類似字典的對象,您可以在視圖中讀取和寫入任意多次,將其修改為希望的。 你可以做所有正常的字典操作,包括清除所有數(shù)據(jù),測試一個鍵是否存在,循環(huán)通過數(shù)據(jù)等。大多數(shù)時候,你只需使用標(biāo)準(zhǔn)的"字典"API來獲取和設(shè)置值。

下面的代碼片段顯示了如何使用與當(dāng)前會話(瀏覽器)相關(guān)聯(lián)的鍵" my_car "來獲取,設(shè)置和刪除一些數(shù)據(jù)。

注意:Django的一大優(yōu)點是,您不需要考慮將會話與您當(dāng)前請求在視圖中綁定的機(jī)制。 如果我們在我們的視圖中使用下面的片段,我們知道 my_car 的信息只與發(fā)送當(dāng)前請求的瀏覽器相關(guān)。

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value 
del request.session['my_car']

API還提供了大多數(shù)用于管理關(guān)聯(lián)的會話cookie的其他方法。 例如,有一些方法可以測試客戶端瀏覽器中支持的Cookie,設(shè)置和檢查Cookie到期日期,以及清除數(shù)據(jù)存儲中的過期會話。 您可以在如何使用會話中找到完整的API Django docs)。

保存會話數(shù)據(jù)

默認(rèn)情況下,Django僅保存到會話數(shù)據(jù)庫,并在會話已修改(分配)或已刪除時將會話cookie發(fā)送到客戶端。 如果你使用它的會話密鑰更新一些數(shù)據(jù),如上一節(jié)所示,那么你不需要擔(dān)心這個! 例如:

# This is detected as an update to the session, so session data is saved.
request.session['my_car'] = 'mini'

如果您要更新會話數(shù)據(jù)中的某些信息,Django將無法識別您對會話所做的更改并保存了數(shù)據(jù)(例如,如果您要更改" 輪子"數(shù)據(jù)在" my_car "數(shù)據(jù)內(nèi),如下所示)。 在這種情況下,您需要將會話顯式標(biāo)記為已修改。

# 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.
request.session.modified = True

注意:您可以更改行為,以便網(wǎng)站可以通過向您的項目設(shè)置中添加 SESSION_SAVE_EVERY_REQUEST = True 來更新每個請求的數(shù)據(jù)庫/發(fā)送Cookie( locallibrary / locallibrary /settings.py )。

簡單的例子 - 獲取訪問計數(shù)

作為一個簡單的現(xiàn)實示例,我們將更新庫以告知當(dāng)前用戶他們訪問了 LocalLibrary 主頁的次數(shù)。

打開 /localibrary/catalog/views.py ,然后以粗體顯示更改。

def index(request):
    ...

    num_authors=Author.objects.count()  # The 'all()' is implied by default.
    
    # Number of visits to this view, as counted in the session variable.
    num_visits=request.session.get('num_visits', 0)
    request.session['num_visits'] = num_visits+1
    
    # Render the HTML template index.html with the data in the context variable.
    return render(
        request,
        'index.html',
        context={'num_books':num_books,'num_instances':num_instances,'num_instances_available':num_instances_available,'num_authors':num_authors,
            'num_visits':num_visits}, # num_visits appended
    )

這里我們首先獲取\'num_visits\'會話密鑰的值,如果之前未設(shè)置,則將值設(shè)置為0。 每次收到請求時,我們都會增加該值并將其存回會話中(下次用戶訪問頁面時)。 然后將 num_visits 變量傳遞給我們的上下文變量中的模板。

注意:我們還可以測試瀏覽器是否支持Cookie(請參閱 http / sessions /">如何使用會話的示例)或設(shè)計我們的UI,以便無論是否支持cookie無關(guān)緊要。

將以下塊底部顯示的行添加到"動態(tài)內(nèi)容"部分底部的主HTML模板( /locallibrary/catalog/templates/index.html ),以顯示上下文變量 :

<h2>Dynamic content</h2>

<p>The library has the following record counts:</p>
<ul>
<li><strong>Books:</strong> {{ num_books }}</li>
<li><strong>Copies:</strong> {{ num_instances }}</li>
<li><strong>Copies available:</strong> {{ num_instances_available }}</li>
<li><strong>Authors:</strong> {{ num_authors }}</li>
</ul>

<p>You have visited this page {{ num_visits }}{% if num_visits == 1 %} time{% else %} times{% endif %}.</p>

保存更改并重新啟動測試服務(wù)器。 每次刷新頁面時,數(shù)字都應(yīng)該更新。

    概要

    您現(xiàn)在知道使用會話改善與匿名用戶的互動是多么容易。

    您現(xiàn)在知道使用會話改善與匿名用戶的互動是多么容易。...

    也可以看看

    以上內(nèi)容是否對您有幫助:
    在線筆記
    App下載
    App下載

    掃描二維碼

    下載編程獅App

    公眾號
    微信公眾號

    編程獅公眾號