用Django全棧開發——25. 利用request.session開發數據中心功能

大家好,這是皮爺給大家帶來的最新的學習Python能幹啥?之Django教程,從零開始,到最後成功部署上線的項目。這一節,我們使用Django的request.session來做文章。

Peekpa.com的官方地址:http://peekpa.com

皮爺的每一篇文章,都配置相對應的代碼。這篇文章的代碼Tag是Post_025

在這裏插入圖片描述

這一節,我們要用到Django的Session功能,來開發一個數據中心頁面。

需求分析

我們的需求很簡單,就是在主頁面,有一個頁面作爲入口,入口的條件就是要輸入密碼。

如果密碼成功,那麼就跳轉到數據中心頁面,如果密碼不對,則什麼都不會發生。

當然,跳轉到數據中心,是有一個url的,我們要在這個url請求的回收,來判斷一下,用戶是否輸入了成功的密碼,如果沒有輸入密碼,則不能進入。

頁面開發

首先我們來在template目錄下,創建一個datacenter文件夾,這裏面就放上面相關的內容:

  • 密碼登錄頁面;
  • 登錄成功頁面,即DataCenter的Dashboard。

在這裏插入圖片描述

這裏,我們的密碼輸入頁面的結構,可以參考index頁面,直接繼承index_base.html頁面;DataCenter的Dashboard的頁面,可以參考CMS的Dashboard頁面,結構類似的繼承一下就好。都非常的簡單。

所以,最後我們開發出來的樣子,密碼輸入頁大致長這個樣子:

在這裏插入圖片描述

DataCenter頁面,長這個樣子:

在這裏插入圖片描述

視圖函數

既然頁面已經編好,接下來我們就要編寫視圖函數了。視圖函數想必大家都會覺得非常的簡單。這裏只是簡單的給介紹一下一些關鍵點就可以。如果有不熟悉的同學,可以看之前的文章《第20講,友鏈的開發》,裏面非常的詳細。

首先創建一個datacenter的應用,然後我們把相關的視圖都放在這裏。

urls.py文件裏面:

urlpatterns = [
    path("code/", views.input_code_view, name="center_input_code"),
    path("validate/", views.validate_code, name="center_validate_code"),

    path("center/", views.center_home_view, name="center_center_home_view"),
]

看到,我們有三個視圖函數,分別對應的方法是:

  • 輸入密碼頁面的視圖函數;
  • 密碼驗證函數;
  • 數據中心首頁函數。

接下來,我們就分別來看這三個函數。密碼輸入函數則非常簡單:

def input_code_view(request):
    context = {
        'code': 'xxx',
    }
    context.update(get_navbar_item_homepage())
    return render(request, 'datacenter/input_code.html', context=context)

直接通過render方法,返回一個html模板即可。非常簡單的Django方法。

密碼驗證函數:

@require_POST
def validate_code(request):
    code = request.POST.get('form-code')
    if code == "xxx":
        request.session['right_code'] = code
        request.session.set_expiry(0)
        return redirect(reverse("center:center_center_home_view"))
    else:
        return redirect(reverse("center:center_input_code"))

這裏是session的重點!!!

首先,我們看到,這裏是一個POST限制的方法。所以,只接受前端發送過的POST表單請求。

這裏最關鍵的一步就是request.session['right_code'] = code,這一步的意思是,我們如果密碼正確,我們就在request的session裏面,塞一個right_code。這個東西我們要在之後的Data Center的數據中心頁面來做一下判斷,如果有這個值,那麼我們就可以放行;若果沒有,就說嘛密碼輸入錯誤,我們就會攔截,將頁面重定向到指定頁面。

其次就是request.session.set_expiry(0)這句話,這句話設置了session的過期時間爲關閉瀏覽器就過期。括號裏面的值可以是對應下面的幾種:

  • 0:關閉瀏覽器自動過期;
  • none:永遠都不會過期;
  • int數字:將在這個數字多少秒之後過期。

這一邏輯,和之前給CMS加登錄限定邏輯是一樣的。

所以,我們的Data Center的Dashboard頁面視圖函數就是這樣:

@peekpa_code_required
def center_home_view(request):
    return render(request, 'datacenter/home/center_home.html')

可以看到這裏使用了一個我們的自定義裝飾器@peekpa_code_required,這個修飾器的位置則是在datacenter/decorators.py文件中。

在這裏插入圖片描述

def peekpa_code_required(func):
    def wrapper(request, *args, **kwargs):
        if request.session.get('right_code') == 'xx':
            return func(request, *args, **kwargs)
        else:
            if request.is_ajax():
                return restful.unauth(message='未授權!')
            else:
                return redirect(reverse('center:center_input_code'))
    return wrapper

裝飾器非常的簡單判斷條件就是如果request.session中有right_code的值,那麼就繼續執行函數;如果沒有,則被判斷授權失敗,就會跳轉到指定頁面。

這樣做的好處就是,你可以讓指定的人來訪問指定的頁面了。有些頁面並不是所有人都能看到的哦,比如這個數據中心。

爲了方便密碼管理,我們這裏還是需要在CMS後臺來寫一套管理程序,這裏就不多介紹了,想要了解的同學,可以去下載下來代碼,自行查閱。

技術總結

最後總結一下,

request.session的用法:

  1. 可以在Session裏面設置一些數值,方便日後訪問網頁的時候做判斷;
  2. 滿足條件之後,通過request.session[name]=value來設置數值;通過request.session.get(name)來讀取數值;
  3. session可以設置過期時間,通過request.seesion.set_expire(value)來設置,value=0表示關閉瀏覽器之後過期,value=none表示永不過期,value=number表示在number秒之後過期;
  4. 完畢。

獲取代碼的唯一途徑:關注『皮爺擼碼』,回覆『代碼』即可獲得。

長按下圖二維碼關注,如文章對你有啓發,歡迎在看與轉發。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章