當session啟用后,傳遞給視圖request參數的httprequest對象將包含一個session屬性,就像一個字典對象一樣。你可以在django的任何地方讀寫request.session屬性,或者多次編輯使用它。
這個文件在我的c:\users\17764530215\test\mysite地址
1.urls.py
1
2
3
4
5
6
7
8
9
10
11
|
from django.contrib import admin from django.urls import path from login import views urlpatterns = [ path( 'admin/' , admin.site.urls), path( 'index/' , views.index), path( 'login/' , views.login), path( 'register/' , views. register ), path( 'logout/' , views.logout), ] |
策略:
- 未登錄人員,不論是訪問index還是login和logout,全部跳轉到login界面
- 已登錄人員,訪問login會自動跳轉到index頁面
- 已登錄人員,不允許直接訪問register頁面,需先logout
- 登出后,自動跳轉到login界面
(wow,這其實就是我們的功能!!)
2.login/models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
from django.db import models # create your models here. class user(models.model): gender = ( ( 'male' , "男" ), ( 'female' , "女" ), ) name = models.charfield(max_length=128, unique= true ) password = models.charfield(max_length=256) email = models.emailfield(unique= true ) sex = models.charfield(max_length=32, choices=gender, default = "男" ) c_time = models.datetimefield(auto_now_add= true ) def __str__(self): return self.name class meta: ordering = [ "-c_time" ] verbose_name = "用戶" verbose_name_plural = "用戶" |
各字段含義:
name: 必填,最長不超過128個字符,并且唯一,也就是不能有相同姓名; password: 必填,最長不超過256個字符(實際可能不需要這么長); email: 使用django內置的郵箱類型,并且唯一; sex: 性別,使用了一個choice,只能選擇男或者女,默認為男; 使用__str__方法幫助人性化顯示對象信息; 元數據里定義用戶按創建時間的反序排列,也就是最近的最先顯示;
3.views.login和login.html
views.login:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
def login(request): if request.session.get( 'is_login' , none): # 不允許重復登錄 return redirect( '/index/' ) if request.method == 'post' : login_form = forms.userform(request.post) #上一次填寫了這個表單,所以從這里得到這個表單的數據 message = '請檢查填寫的內容!' if login_form.is_valid(): username = login_form.cleaned_data.get( 'username' ) password = login_form.cleaned_data.get( 'password' ) try : user = models.user.objects.get(name=username) except : message = '用戶不存在!' return render(request, 'login/login.html' , locals()) if user.password == password: #如果用戶名和密碼都成功 # 往session字典內寫入用戶狀態和數據: request.session[ 'is_login' ] = true #is_login= true 表示成功登陸 request.session[ 'user_id' ] = user.id request.session[ 'user_name' ] = user.name return redirect( '/index/' ) #重定向到主頁 else : message = '密碼不正確!' return render(request, 'login/login.html' , locals()) else : return render(request, 'login/login.html' , locals()) # 不是post的話,統統轉去login.html login_form = forms.userform() return render(request, 'login/login.html' , locals()) |
我們進入login時,會去session里面找is_login項,如果為true就表示已經登陸了,所以就重定向到/index/中,進入首頁.
如果為false,即沒有登陸,那么往下走。如果是post方法,那么執行一系列操作,如果不是post,就表示是第一次用get的方式登陸到這個login網頁的,那么就用forms.userform產生一個對象login_form,將其作為參數傳到login/login.html模板文件中,待會再介紹這個文件。
如果為false,且是post時,就表明是填寫了表單的,這里就涉及很多業務邏輯和session的管理了,重點講。如果login_form.is_valid() 如下:通過login_form = forms.userform(request.post)得到填寫的這個表單數據,然后去和數據庫的用戶名密碼去驗證,如果通過了,那么就將request.session['is_login']改為true,表示在登陸狀態,并且把user_id和user_name字段也改成對應的數據,這個之后應該有用.
下面進入login/login.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<!doctype html> <html lang= "en" > <head> <!-- required meta tags --> <meta charset= "utf-8" > <meta name= "viewport" content= "width=device-width, initial-scale=1, shrink-to-fit=no" > <!-- 上述meta標簽*必須*放在最前面,任何其他內容都*必須*跟隨其后! --> <!-- bootstrap css --> <link href= "https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel= "stylesheet" > <title>登錄</title> </head> <body> < div class = "container" > < div class = "col" > <form class = "form-login" action= "/login/" method= "post" > {% if message %} < div class = "alert alert-warning" >{{ message }}</ div > {% endif %} {% csrf_token %} <h3 class = "text-center" >歡迎登錄</h3> {{ login_form }} < div > <a href= "/register/" rel= "external nofollow" rel= "external nofollow" rel= "external nofollow" rel= "external nofollow" class = "text-success " ><ins>新用戶注冊</ins></a> <button type= "submit" class = "btn btn-primary float-right" >登錄</button> </ div > </form> </ div > </ div > <!-- /container --> <!-- optional javascript --> <!-- jquery first, then popper.js, then bootstrap js --> {# 以下三者的引用順序是固定的#} <script src= "https://cdn.bootcss.com/jquery/3.3.1/jquery.js" ></script> <script src= "https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.js" ></script> <script src= "https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js" ></script> </body> </html> |
這里重要的地方是這個語句——{{ login_form }},在這個位置插入了一個表單login_form,然后填寫好這個表單以后,用view里面的login函數通過執行login_form = forms.userform(request.post)來獲取填寫的這個表單數據,然后去進行校驗等等操作...
有了這兩個,我們的權限管理就基本完成了!本質上,這倆東西提供了一種機制————可以對輸入的用戶數據存在session里,然后校驗的時候從session中取出,去判斷是否是合法的用戶。那么,我們只需要再修改一下index.html,也是用session去校驗,這樣,直接通過網址訪問的用戶,由于沒有session,就會被攔截!
4.views.index
1
2
3
4
|
def index(request): if not request.session.get( 'is_login' , none): #如果不在登陸狀態,就重定向到login return redirect( '/login/' ) return render(request, 'login/index.html' ) #如果在登陸狀態,就進入index.html的模板文件 |
這里邏輯很清楚:如果不在登陸狀態,就重定向到login;如果在登陸狀態,就直接重定向到真正的login/index.html模板。在這么模板中,我們就可以開發各種功能了,該demo中的login/index/html如下:
1
2
3
4
5
6
7
8
9
10
|
<!doctype html> <!-- optional javascript --> <!-- jquery first, then popper.js, then bootstrap js --> {# 以下三者的引用順序是固定的#} <script src= "https://cdn.bootcss.com/jquery/3.3.1/jquery.js" ></script> <script src= "https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.js" ></script> <script src= "https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js" ></script> ? </body> </html> |
這里重要的地方是這個語句——{{ login_form }},在這個位置插入了一個表單login_form,然后填寫好這個表單以后,用view里面的login函數通過執行login_form = forms.userform(request.post)來獲取填寫的這個表單數據,然后去進行校驗等等操作...?有了這兩個,我們的權限管理就基本完成了!本質上,這倆東西提供了一種機制————可以對輸入的用戶數據存在session里,然后校驗的時候從session中取出,去判斷是否是合法的用戶。那么,我們只需要再修改一下index.html,也是用session去校驗,這樣,直接通過網址訪問的用戶,由于沒有session,就會被攔截!?
4.views.index
1
2
3
4
|
def index(request): if not request.session.get( 'is_login' , none): #如果不在登陸狀態,就重定向到login return redirect( '/login/' ) return render(request, 'login/index.html' ) #如果在登陸狀態,就進入index.html的模板文件 |
這里邏輯很清楚:如果不在登陸狀態,就重定向到login;如果在登陸狀態,就直接重定向到真正的login/index.html模板。在這么模板中,我們就可以開發各種功能了,該demo中的login/index/html如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
<html lang= "en" > <head> <meta charset= "utf-8" > <title>首頁</title> </head> <body> <h1>{{ request.session.user_name }}! 歡迎回來!</h1> <p> <a href= "/logout/" >登出</a> </p> </body> </html> |
最后,再來看看logout的實現吧
5.views.logout
1
2
3
4
5
6
7
8
9
10
11
|
def logout(request): #登出 if not request.session.get( 'is_login' , none): #如果不在登陸狀態,就直接轉發到登陸界面 # 如果本來就未登錄,也就沒有登出一說 return redirect( "/login/" ) request.session.flush() #清空session # 或者使用下面的方法 # del request.session['is_login'] # del request.session['user_id'] # del request.session['user_name'] return redirect( "/login/" ) #重定向到login界面 |
如果未登陸,那么直接重定向/login/界面,如果是登陸狀態,那么需要先通過 request.session.flush()來清空session,然后再重定向到/login/的登陸界面.
6.總結session和forms的搭配
forms其實是在html中,通過將表單和對象聯系在一起,就可以很容易在填寫表單后,通過forms去找到填寫的內容。
session其實是權限校驗的利器!沒有session的時候,用戶可以直接訪問index界面,有session的時候,index函數的處理邏輯就變成通過session去判斷是否登陸。當然,與之配套,還必須要用login,logout等函數來維護好這個session信息,保證一個不變性——所有session中的is_login字段為true的時候,都是真正的登陸用戶.
到此這篇關于django中session進行權限管理的使用的文章就介紹到這了,更多相關django session權限管理內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://juejin.cn/post/6982399924499382309