最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django中session進行權限管理的使用

 更新時間:2021年07月09日 08:41:18   作者:Simuels  
本文主要介紹了Django中session進行權限管理的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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

這個文件在我的C:\Users\17764530215\test\mysite地址

1.urls.py

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,這其實就是我們的功能!?。?/p>

2.login/models.py

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內(nèi)置的郵箱類型,并且唯一; sex: 性別,使用了一個choice,只能選擇男或者女,默認為男; 使用__str__方法幫助人性化顯示對象信息; 元數(shù)據(jù)里定義用戶按創(chuàng)建時間的反序排列,也就是最近的最先顯示;

3.views.login和login.html

views.login:

def login(request):
    if request.session.get('is_login', None):  # 不允許重復登錄
        return redirect('/index/')
    if request.method == 'POST':
        login_form = forms.UserForm(request.POST)   #上一次填寫了這個表單,所以從這里得到這個表單的數(shù)據(jù)
        message = '請檢查填寫的內(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/')  #重定向到主頁
            else:
                message = '密碼不正確!'
                return render(request, 'login/login.html', locals())
        else:
            return render(request, 'login/login.html', locals())

    # 不是POST的話,統(tǒng)統(tǒng)轉去login.html
    login_form = forms.UserForm()
    return render(request, 'login/login.html', locals())

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

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

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

下面進入login/login.html

<!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標簽*必須*放在最前面,任何其他內(nèi)容都*必須*跟隨其后! -->
    <!-- Bootstrap CSS -->
    <link  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函數(shù)通過執(zhí)行l(wèi)ogin_form = forms.UserForm(request.POST)來獲取填寫的這個表單數(shù)據(jù),然后去進行校驗等等操作...

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

4.views.index

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),就進入index.html的模板文件

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

<!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函數(shù)通過執(zhí)行l(wèi)ogin_form = forms.UserForm(request.POST)來獲取填寫的這個表單數(shù)據(jù),然后去進行校驗等等操作...​有了這兩個,我們的權限管理就基本完成了!本質上,這倆東西提供了一種機制————可以對輸入的用戶數(shù)據(jù)存在session里,然后校驗的時候從session中取出,去判斷是否是合法的用戶。那么,我們只需要再修改一下index.html,也是用session去校驗,這樣,直接通過網(wǎng)址訪問的用戶,由于沒有session,就會被攔截!​

4.views.index

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),就進入index.html的模板文件

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

<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的實現(xiàn)吧

5.views.logout

def logout(request):    #登出
    if not request.session.get('is_login', None):   #如果不在登陸狀態(tài),就直接轉發(fā)到登陸界面
        # 如果本來就未登錄,也就沒有登出一說
        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),那么需要先通過 request.session.flush()來清空session,然后再重定向到/login/的登陸界面.

6.總結session和forms的搭配

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

到此這篇關于Django中session進行權限管理的使用的文章就介紹到這了,更多相關Django session權限管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python學習之線程池與GIL全局鎖詳解

    Python學習之線程池與GIL全局鎖詳解

    本文我們將學習線程池的創(chuàng)建與全局鎖。線程池的創(chuàng)建于進程池的原理是相同的;關于GIL全局鎖,暫時沒有代碼上的練習,而是對其概念進行一個簡單的啟蒙,感興趣的可以了解一下
    2022-04-04
  • python對兩個列表求交集的三種實現(xiàn)方法

    python對兩個列表求交集的三種實現(xiàn)方法

    本文主要介紹了python對兩個列表求交集的實現(xiàn)示例,包括使用集合、列表推導式和itertools.filterfalse,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • python中列表推導式與生成器表達式對比詳解

    python中列表推導式與生成器表達式對比詳解

    python當然不是一門編譯型語言,但是它還是要被解析成二進制的字節(jié)碼才能被執(zhí)行,執(zhí)行它的正是python解釋器,下面這篇文章主要給大家介紹了關于python中列表推導式與生成器表達式對比的相關資料,需要的朋友可以參考下
    2023-01-01
  • Python reduce函數(shù)作用及實例解析

    Python reduce函數(shù)作用及實例解析

    這篇文章主要介紹了Python reduce函數(shù)作用及實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • python裝飾器實例大詳解

    python裝飾器實例大詳解

    這篇文章主要介紹了python裝飾器實例大詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-10-10
  • 一文詳解為什么運行Python就是找不到文件路徑

    一文詳解為什么運行Python就是找不到文件路徑

    這篇文章主要介紹了在編程中遇到文件路徑找不到問題的原因和解決方法,包括路徑錯誤、路徑分隔符問題、工作目錄錯誤、權限問題以及虛擬環(huán)境的影響,并提供了一些實用的解決方案,通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-01-01
  • 詳解Python中的array數(shù)組模塊相關使用

    詳解Python中的array數(shù)組模塊相關使用

    數(shù)組并不是Python中內(nèi)置的標配數(shù)據(jù)結構,不過擁有array模塊我們也可以在Python中使用數(shù)組結構,下面我們就來詳解詳解Python中的array數(shù)組模塊相關使用
    2016-07-07
  • django與vue的完美結合_實現(xiàn)前后端的分離開發(fā)之后在整合的方法

    django與vue的完美結合_實現(xiàn)前后端的分離開發(fā)之后在整合的方法

    今天小編就為大家分享一篇django與vue的完美結合_實現(xiàn)前后端的分離開發(fā)之后在整合的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python驗證碼圖片處理(二值化)

    python驗證碼圖片處理(二值化)

    這篇文章主要介紹了python驗證碼圖片處理(二值化),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 完美解決Python2操作中文名文件亂碼的問題

    完美解決Python2操作中文名文件亂碼的問題

    下面小編就為大家?guī)硪黄昝澜鉀QPython2操作中文名文件亂碼的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01

最新評論

长沙县| 皮山县| 新龙县| 桐柏县| 朔州市| 惠东县| 黄石市| 洪洞县| 巢湖市| 鲜城| 栾川县| 双江| 兰西县| 潮州市| 类乌齐县| 长宁县| 那曲县| 北票市| 邵武市| 神木县| 颍上县| 长春市| 新余市| 青浦区| 松原市| 法库县| 大港区| 淮安市| 吉木萨尔县| 莱州市| 宜章县| 瑞安市| 沙湾县| 鲁甸县| 修武县| 新绛县| 吐鲁番市| 鸡东县| 尼玛县| 淮南市| 寿光市|