一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Django中session進(jìn)行權(quán)限管理的使用

Django中session進(jìn)行權(quán)限管理的使用

2021-12-12 22:02Simuels Python

本文主要介紹了Django中session進(jìn)行權(quán)限管理的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

當(dāng)session啟用后,傳遞給視圖request參數(shù)的httprequest對(duì)象將包含一個(gè)session屬性,就像一個(gè)字典對(duì)象一樣。你可以在django的任何地方讀寫request.session屬性,或者多次編輯使用它。

這個(gè)文件在我的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),
]

Django中session進(jìn)行權(quán)限管理的使用

策略:

  • 未登錄人員,不論是訪問(wèn)index還是login和logout,全部跳轉(zhuǎn)到login界面
  • 已登錄人員,訪問(wèn)login會(huì)自動(dòng)跳轉(zhuǎn)到index頁(yè)面
  • 已登錄人員,不允許直接訪問(wèn)register頁(yè)面,需先logout
  • 登出后,自動(dòng)跳轉(zhuǎn)到login界面

(wow,這其實(shí)就是我們的功能!!)

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: 必填,最長(zhǎng)不超過(guò)128個(gè)字符,并且唯一,也就是不能有相同姓名; password: 必填,最長(zhǎng)不超過(guò)256個(gè)字符(實(shí)際可能不需要這么長(zhǎng)); email: 使用django內(nèi)置的郵箱類型,并且唯一; sex: 性別,使用了一個(gè)choice,只能選擇男或者女,默認(rèn)為男; 使用__str__方法幫助人性化顯示對(duì)象信息; 元數(shù)據(jù)里定義用戶按創(chuàng)建時(shí)間的反序排列,也就是最近的最先顯示;

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):  # 不允許重復(fù)登錄
        return redirect('/index/')
    if request.method == 'post':
        login_form = forms.userform(request.post)   #上一次填寫了這個(gè)表單,所以從這里得到這個(gè)表單的數(shù)據(jù)
        message = '請(qǐng)檢查填寫的內(nèi)容!'
        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字典內(nèi)寫入用戶狀態(tài)和數(shù)據(jù):
                request.session['is_login'] = true  #is_login=true表示成功登陸
                request.session['user_id'] = user.id
                request.session['user_name'] = user.name
                return redirect('/index/')  #重定向到主頁(yè)
            else:
                message = '密碼不正確!'
                return render(request, 'login/login.html', locals())
        else:
            return render(request, 'login/login.html', locals())
 
    # 不是post的話,統(tǒng)統(tǒng)轉(zhuǎn)去login.html
    login_form = forms.userform()
    return render(request, 'login/login.html', locals())

我們進(jìn)入login時(shí),會(huì)去session里面找is_login項(xiàng),如果為true就表示已經(jīng)登陸了,所以就重定向到/index/中,進(jìn)入首頁(yè).

如果為false,即沒(méi)有登陸,那么往下走。如果是post方法,那么執(zhí)行一系列操作,如果不是post,就表示是第一次用get的方式登陸到這個(gè)login網(wǎng)頁(yè)的,那么就用forms.userform產(chǎn)生一個(gè)對(duì)象login_form,將其作為參數(shù)傳到login/login.html模板文件中,待會(huì)再介紹這個(gè)文件。

如果為false,且是post時(shí),就表明是填寫了表單的,這里就涉及很多業(yè)務(wù)邏輯和session的管理了,重點(diǎn)講。如果login_form.is_valid() 如下:通過(guò)login_form = forms.userform(request.post)得到填寫的這個(gè)表單數(shù)據(jù),然后去和數(shù)據(jù)庫(kù)的用戶名密碼去驗(yàn)證,如果通過(guò)了,那么就將request.session['is_login']改為true,表示在登陸狀態(tài),并且把user_id和user_name字段也改成對(duì)應(yīng)的數(shù)據(jù),這個(gè)之后應(yīng)該有用.

下面進(jìn)入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標(biāo)簽*必須*放在最前面,任何其他內(nèi)容都*必須*跟隨其后! -->
    <!-- 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>新用戶注冊(cè)</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>

這里重要的地方是這個(gè)語(yǔ)句——{{ login_form }},在這個(gè)位置插入了一個(gè)表單login_form,然后填寫好這個(gè)表單以后,用view里面的login函數(shù)通過(guò)執(zhí)行l(wèi)ogin_form = forms.userform(request.post)來(lái)獲取填寫的這個(gè)表單數(shù)據(jù),然后去進(jìn)行校驗(yàn)等等操作...

有了這兩個(gè),我們的權(quán)限管理就基本完成了!本質(zhì)上,這倆東西提供了一種機(jī)制————可以對(duì)輸入的用戶數(shù)據(jù)存在session里,然后校驗(yàn)的時(shí)候從session中取出,去判斷是否是合法的用戶。那么,我們只需要再修改一下index.html,也是用session去校驗(yàn),這樣,直接通過(guò)網(wǎng)址訪問(wèn)的用戶,由于沒(méi)有session,就會(huì)被攔截!

4.views.index

?
1
2
3
4
def index(request):
    if not request.session.get('is_login', none):   #如果不在登陸狀態(tài),就重定向到login
        return redirect('/login/')
    return render(request, 'login/index.html')  #如果在登陸狀態(tài),就進(jìn)入index.html的模板文件

這里邏輯很清楚:如果不在登陸狀態(tài),就重定向到login;如果在登陸狀態(tài),就直接重定向到真正的login/index.html模板。在這么模板中,我們就可以開(kāi)發(fā)各種功能了,該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>

這里重要的地方是這個(gè)語(yǔ)句——{{ login_form }},在這個(gè)位置插入了一個(gè)表單login_form,然后填寫好這個(gè)表單以后,用view里面的login函數(shù)通過(guò)執(zhí)行l(wèi)ogin_form = forms.userform(request.post)來(lái)獲取填寫的這個(gè)表單數(shù)據(jù),然后去進(jìn)行校驗(yàn)等等操作...?有了這兩個(gè),我們的權(quán)限管理就基本完成了!本質(zhì)上,這倆東西提供了一種機(jī)制————可以對(duì)輸入的用戶數(shù)據(jù)存在session里,然后校驗(yàn)的時(shí)候從session中取出,去判斷是否是合法的用戶。那么,我們只需要再修改一下index.html,也是用session去校驗(yàn),這樣,直接通過(guò)網(wǎng)址訪問(wèn)的用戶,由于沒(méi)有session,就會(huì)被攔截!?

4.views.index

?
1
2
3
4
def index(request):
    if not request.session.get('is_login', none):   #如果不在登陸狀態(tài),就重定向到login
        return redirect('/login/')
    return render(request, 'login/index.html')  #如果在登陸狀態(tài),就進(jìn)入index.html的模板文件

這里邏輯很清楚:如果不在登陸狀態(tài),就重定向到login;如果在登陸狀態(tài),就直接重定向到真正的login/index.html模板。在這么模板中,我們就可以開(kāi)發(fā)各種功能了,該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>首頁(yè)</title>
</head>
<body>
<h1>{{ request.session.user_name }}!  歡迎回來(lái)!</h1>
<p>
    <a href="/logout/">登出</a>
</p>
</body>
</html>

Django中session進(jìn)行權(quán)限管理的使用

最后,再來(lái)看看logout的實(shí)現(xiàn)吧

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):   #如果不在登陸狀態(tài),就直接轉(zhuǎn)發(fā)到登陸界面
        # 如果本來(lái)就未登錄,也就沒(méi)有登出一說(shuō)
        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/界面,如果是登陸狀態(tài),那么需要先通過(guò) request.session.flush()來(lái)清空session,然后再重定向到/login/的登陸界面.

6.總結(jié)session和forms的搭配

forms其實(shí)是在html中,通過(guò)將表單和對(duì)象聯(lián)系在一起,就可以很容易在填寫表單后,通過(guò)forms去找到填寫的內(nèi)容。
session其實(shí)是權(quán)限校驗(yàn)的利器!沒(méi)有session的時(shí)候,用戶可以直接訪問(wèn)index界面,有session的時(shí)候,index函數(shù)的處理邏輯就變成通過(guò)session去判斷是否登陸。當(dāng)然,與之配套,還必須要用login,logout等函數(shù)來(lái)維護(hù)好這個(gè)session信息,保證一個(gè)不變性——所有session中的is_login字段為true的時(shí)候,都是真正的登陸用戶.

到此這篇關(guān)于django中session進(jìn)行權(quán)限管理的使用的文章就介紹到這了,更多相關(guān)django session權(quán)限管理內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://juejin.cn/post/6982399924499382309

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 东京干福利 | 国产精品拍拍拍福利在线观看 | 日本免费观看95视频网站 | 欧美视频一区二区三区在线观看 | 国产suv精品一区二区四区三区 | 国产成人cao在线 | 亚洲精品国产成人99久久 | 午夜国产理论 | 男gay网站视频免费观看 | 叛佛 作者满栀小说免费阅读 | 无套暴躁白丝秘书 | 女人全身裸露无遮挡免费观看 | 500福利第一导航 | 东方影视欧美天天影院 | h在线动漫| 色欲都市 | 亚洲国产精品久久网午夜 | 欧美老肥妇bbb | 动漫美女被褥吸奶漫画漫画 | 欧式午夜理伦三级在线观看 | 亚洲精品视 | 亚洲精品123区在线观看 | 日韩 欧美 国产 亚洲 中文 | 洗濯屋动漫在线观看 | 亚洲同性男男gay1069 | 手机在线免费观看高清 | 久久99r66热这里有精品 | 四虎www| 99精品视频在线观看re | 国产成人在线影院 | 亚洲第一综合网站 | 四虎最新永久免费视频 | 午夜在线观看免费观看 视频 | 男人吃奶动态图 | 国产91一区二区在线播放不卡 | kuaibo成人播放器 | 日本javaajax| 亚洲成A人片在线观看中文L | 亚洲无线一二三四区 | 99re精品在线 | 亚洲精品久久久打桩机 |