乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Django 教程 7: 會(huì)話框架

       寧?kù)o致遠(yuǎn)oj1kn5 2019-06-13

      本教程擴(kuò)展了我們的LocalLibrary網(wǎng)站,為主頁(yè)添加了一個(gè)基于會(huì)話的訪問(wèn)計(jì)數(shù)器。這是一個(gè)相對(duì)簡(jiǎn)單的例子,但它確實(shí)顯示了,如何使用會(huì)話框架為匿名用戶提供持久的行為。

      先決條件: 完成之前的所有教程主題,包括Django教程6:通用列表和詳細(xì)信息視圖
      目標(biāo): 了解會(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ì)話框架允許您實(shí)現(xiàn)此類行為,允許您基于每個(gè)站點(diǎn)訪問(wèn)者,以儲(chǔ)存和檢索任意數(shù)據(jù)。

      會(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)的INSTALLED_APPSMIDDLEWARE 部分中設(shè)置,如下所示:

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

      使用會(huì)話節(jié)

      您可以從request請(qǐng)求參數(shù)訪問(wèn)視圖中的session會(huì)話屬性(作為視圖的第一個(gè)參數(shù)傳入的HttpRequest)。此會(huì)話屬性,表示與當(dāng)前用戶的特定連接(或者更確切地說(shuō),是與當(dāng)前瀏覽器的連接,由此站點(diǎn)的瀏覽器cookie中的會(huì)話ID標(biāo)識(shí))。

      會(huì)話session屬性是一個(gè)類似字典的對(duì)象,您可以在視圖中多次讀取和寫入,并根據(jù)需要進(jìn)行修改。您可以執(zhí)行所有常規(guī)的字典操作,包括清除所有數(shù)據(jù),測(cè)試是否存在密鑰,循環(huán)數(shù)據(jù)等。大多數(shù)情況下,您只需使用標(biāo)準(zhǔn) “字典” API,來(lái)獲取和設(shè)置值。

      下面的代碼片段,顯示了如何使用與當(dāng)前會(huì)話(瀏覽器)關(guān)聯(lián)的密鑰“my_car”來(lái)獲取,設(shè)置和刪除某些數(shù)據(jù)。

      注意: 關(guān)于Django的一個(gè)好處是,你不需要考慮在你的視圖中,將會(huì)話與當(dāng)前請(qǐng)求聯(lián)系起來(lái)的機(jī)制。如果我們?cè)谝晥D中,使用下面的片段,我們就知道有關(guān)my_car的信息,僅與發(fā)送當(dāng)前請(qǐng)求的瀏覽器相關(guān)聯(liá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還提供了許多其他方法,主要用于管理關(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)!例如:

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

      如果您正在更新會(huì)話數(shù)據(jù)中的某些信息,那么Django將無(wú)法識(shí)別您已對(duì)會(huì)話進(jìn)行了更改并保存了數(shù)據(jù)(例如,如果您要更改“my_car”數(shù)據(jù)中的“輪子”wheels數(shù)據(jù),如下所示)。在這種情況下,您需要將會(huì)話明確標(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
      

      注意: 您可以通過(guò)將SESSION_SAVE_EVERY_REQUEST = True添加到項(xiàng)目設(shè)置(locallibrary/locallibrary/settings.py),以更改站點(diǎn)行為,站點(diǎn)將在每個(gè)請(qǐng)求上更新數(shù)據(jù)庫(kù)/發(fā)送cookie。

      簡(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,并在下面以粗體顯示更改。

      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'會(huì)話密鑰的值,如果之前沒(méi)有設(shè)置,則將值設(shè)置為0。每次收到請(qǐng)求時(shí),我們都會(huì)遞增該值,并將其存回會(huì)話中(下次用戶訪問(wèn)該頁(yè)面時(shí))。然后將num_visits變量,傳遞給上下文變量中的模板。

      注意: 我們也可能會(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)容” 部分底部,以顯示上下文變量:

      <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>

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

      總結(jié)節(jié)

      你現(xiàn)在知道,使用sessions 改善與匿名使用者的互動(dòng),有多么容易了。

      在我們的下一篇文章,我們將解釋授權(quán)與許可框架,并演示如何支持使用者帳戶。

      參見(jiàn)節(jié)

       

      本教程節(jié)

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多