大家好,這是皮爺給大家帶來的最新的學習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的用法:
- 可以在Session裏面設置一些數值,方便日後訪問網頁的時候做判斷;
- 滿足條件之後,通過
request.session[name]=value
來設置數值;通過request.session.get(name)
來讀取數值; - session可以設置過期時間,通過request.seesion.set_expire(value)來設置,value=0表示關閉瀏覽器之後過期,value=none表示永不過期,value=number表示在number秒之後過期;
- 完畢。
獲取代碼的唯一途徑:關注『皮爺擼碼』,回覆『代碼』即可獲得。
長按下圖二維碼關注,如文章對你有啓發,歡迎在看與轉發。