【Django】-6- 登錄用戶身份鑒權

一、🛡? Django 鑒權 & 登錄控制?

Django 自帶的鑒權系統(用戶身份管理小管家)

?

鑒權系統能干啥?

Django 自帶的鑒權系統,就像一個?“用戶身份管家”?,幫你管好這些事兒:

功能類比
加密存儲用戶密碼把用戶的 “秘密”(密碼)鎖進保險箱,存的時候自動加密~
登錄表單提供 “登錄頁面模板”(雖然需要自己改改樣式,但基礎功能有了)~
驗證賬號密碼檢查用戶輸入的賬號密碼對不對,像 “門衛查身份證”~
驗證是否登錄判斷用戶 “有沒有帶身份憑證”,沒登錄就不讓進某些頁面~
針對單用戶的權限設置給不同用戶發 “權限卡片”(比如管理員能刪數據,普通用戶只能看)~

?

啟用鑒權系統的條件(配置檢查)

要讓鑒權系統工作,項目里得有這兩個 “開關”(在?settings.py?):

①?INSTALLED_APPS?里要有這倆
INSTALLED_APPS = [..."django.contrib.auth",  # 鑒權核心功能"django.contrib.contenttypes",  # 輔助管理權限...
]

  • 類比:給 “身份管家” 開通 “系統權限”,讓它能在項目里工作~

?

②?MIDDLEWARE?里要有這倆中間件
MIDDLEWARE = [..."django.contrib.sessions.middleware.SessionMiddleware",  # 管理用戶會話(登錄狀態)"django.contrib.auth.middleware.AuthenticationMiddleware",  # 管理用戶身份驗證...
]

  • SessionMiddleware:給用戶發 “會話餅干”(記錄登錄狀態)~
  • AuthenticationMiddleware:檢查用戶的 “身份餅干”,確認是否登錄~
  • 類比:給 “身份管家” 配兩個小助手,一個發餅干、一個查餅干~

?

禁止匿名訪問(攔住沒登錄的人!)

場景

有些頁面 / 功能(比如 “發布評論”),必須?登錄后才能用?!如果匿名用戶(沒登錄的人)訪問,就 “攔住他”,讓他先登錄~

?

方法 1:手動判斷(一步步攔)

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt  # 演示用,實際要開CSRFdef submit(request):# request.user 是鑒權系統給的“用戶身份對象”if not request.user.is_authenticated:  # is_authenticated 是“檢查是否登錄”的小開關return HttpResponse("請登錄后再發布", status=401)# 登錄了就繼續處理發布邏輯...
流程:
  1. request.user:鑒權系統把 “當前用戶身份” 放到?request?里,你可以直接用~
  2. request.user.is_authenticated:判斷用戶?是否登錄?(登錄了返回?True?,沒登錄返回?False?)~
  3. 如果沒登錄,返回 “請登錄” 的提示(status=401?表示 “未授權” )~
類比:

你:“小管家!看看這個用戶有沒有登錄,沒登錄就攔住他!”
小管家:檢查?request.user?的 “身份憑證”,沒登錄就說 “請先登錄~”

?

方法 2:@login_required 裝飾器(一鍵攔)

from django.contrib.auth.decorators import login_required@login_required
def submit(request):# 只有登錄用戶能進這個視圖!...
流程:
  • @login_required?是 Django 提供的 “快捷攔人裝飾器”~
  • 如果用戶沒登錄,自動?跳轉到登錄頁面?(需要在?settings.py?配置?LOGIN_URL?)~
類比:

你給 “發布評論” 的門掛了一個 “登錄才能進” 的魔法門牌(@login_required?)~
沒登錄的人想進門,直接被傳送到 “登錄頁面”~

?

方法 2 的配置(讓跳轉生效)

在?settings.py?里加一行:

LOGIN_URL = '/login/'  # 登錄頁面的 URL

  • 這樣,匿名用戶訪問被?@login_required?裝飾的視圖時,會自動跳轉到?/login/?~

?Django 為了方便開發者處理用戶的認證(登錄、登出等)相關操作,內置了一套鑒權系統。

當你在項目的 URL 配置里,使用?include("django.contrib.auth.urls")?后,就相當于給項目 “接入” 了鑒權系統的一系列 URL (添加一個路由),其中就有?/accounts/login/?。

它的工作方式

?

視圖函數

當用戶訪問?/accounts/login/?時,Django 會找到鑒權系統里對應的視圖函數(?LoginView?,它是一個基于類的視圖)。這個視圖函數就像一個 “登錄小助手”,負責處理用戶登錄的邏輯,比如驗證用戶輸入的用戶名和密碼是否正確。

?

表單處理

?LoginView?會自動生成一個登錄表單 ,包含用戶名和密碼的輸入框。就好比小助手準備了一張 “登錄申請表”,讓用戶填寫信息。而且它還會對用戶提交的表單數據進行校驗,看看用戶名和密碼是不是匹配數據庫里存儲的用戶信息。

?

登錄狀態管理

如果用戶輸入的信息正確,LoginView?會通過 Django 的會話機制,給用戶設置登錄狀態。這就像給用戶發了一張 “小鎮通行證”,用戶后續訪問需要登錄才能查看的頁面時,Django 就能通過這張 “通行證” 確認用戶已經登錄啦。

?

可定制性

雖然?/accounts/login/?是 Django 提供的,但它也是可以定制的哦。默認情況下它會去尋找?registration/login.html?這個模板文件來展示登錄頁面

總結(小劇場)

鑒權系統小劇場

你:“小管家!我需要管理用戶登錄、權限,你能幫我嗎?”
小管家:“當然!我有加密密碼、驗證登錄、管理權限的本事~ 不過你得在?settings.py?里開一下我的權限!”

?

禁止匿名訪問小劇場

方法 1 場景
用戶(沒登錄)想訪問 “發布評論” 頁面~
小管家檢查?request.user?,發現沒登錄 → 攔住:“請登錄后再發布!”

方法 2 場景
用戶(沒登錄)想訪問 “發布評論” 頁面~
小管家看到門上掛了?@login_required?→ 直接把用戶傳送到登錄頁面:“先登錄才能進!”

二、🚪 Django 登錄頁面實現?

實現登錄頁面的流程(創建視圖 + 路由)

?

1. 核心思路

Django 自帶的鑒權系統,已經幫我們寫好了?登錄邏輯?(驗證賬號密碼、設置登錄狀態),但?登錄頁面的模板需要自己提供?!

實現步驟就兩步:

  • 配路由(讓?/accounts/login/?能找到 Django 自帶的登錄視圖)
  • 寫登錄頁面模板(告訴 Django 登錄頁面長啥樣)

?

2. 配置路由(讓請求找到 Django 登錄視圖)

from django.urls import path, includeurlpatterns = [# 包含 Django 自帶的 auth 路由path("accounts/", include("django.contrib.auth.urls")),
]

  • include("django.contrib.auth.urls"):這是 Django 提供的 “快捷路由”,里面包含了?/accounts/login//accounts/logout/?等常用登錄、登出路由~
  • 類比:你給 “登錄功能” 的請求,設置了一個 “自動導航”,讓 Django 自帶的登錄視圖處理請求~
訪問效果

當你訪問?http://127.0.0.1:8000/accounts/login/?時,Django 會找到自帶的?LoginView?處理請求~

?

報錯分析:TemplateDoesNotExist(模板找不到)

錯誤信息解讀

TemplateDoesNotExist at /accounts/login/
registration/login.html

  • Django 想找?registration/login.html?這個模板文件,但沒找到~

為什么會找這個模板?

Django 自帶的?LoginView?默認會去?templates/registration/login.html?找登錄頁面模板~
如果你的項目里沒有這個文件,就會報錯!

?

解決方法(給 Django 一個登錄頁面)

?

方法 1:自己寫?login.html?模板

步驟 1:創建模板文件

在你的 App(比如?beifan?)目錄下,創建這樣的路徑:

beifan/
└── templates/└── registration/└── login.html

template、registration是目錄

  • 路徑必須是?templates/registration/login.html?,因為 Django 默認找這個位置~

?

步驟 2:寫模板內容

在?login.html?里寫登錄頁面的 HTML ,比如:

<!DOCTYPE html>
<html>
<head><title>登錄</title>
</head>
<body><h1>歡迎登錄</h1><form method="post">{% csrf_token %}  <!-- 必須加,防止跨站攻擊 -->{{ form.as_p }}   <!-- 自動渲染登錄表單 --><button type="submit">登錄</button></form>
</body>
</html>

  • {{ form.as_p }}:Django 會自動生成用戶名、密碼的輸入框~

?

方法 2:復用 Django admin 的登錄模板(偷懶版)

錯誤信息里的提示
{# beifan/templates/registration/login.html #}
{% extends "admin/login.html" %}

  • 這行代碼的意思是:“讓登錄頁面繼承 Django admin 的登錄模板”,這樣不用自己寫樣式~

?

步驟 1:創建模板文件

同樣在?beifan/templates/registration/login.html?里寫:

{% extends "admin/login.html" %}

  • {% extends "admin/login.html" %}:表示 “我的登錄頁面,用 Django admin 的登錄頁面樣式”~

?

步驟 2:確保 Django 能找到模板

在?settings.py?里,確保你的 App(beifan?)在?INSTALLED_APPS?里,并且模板配置正確:

INSTALLED_APPS = [...'beifan',...
]TEMPLATES = [{...'APP_DIRS': True,  # 允許 Django 在 App 的 templates 目錄找模板...},
]

?

步驟 3:檢查模板路徑

確保你的模板文件路徑是:

beifan/
└── templates/└── registration/└── login.html

  • 這樣 Django 就能找到?registration/login.html?,繼承?admin/login.html?的樣式~

?

總結(小劇場)

實現登錄頁小劇場

你:“Django 呀,我要做個登錄頁面,用戶訪問?/accounts/login/?時能登錄~”
Django:“好呀!你配好路由(include('django.contrib.auth.urls')?),再給我一個?registration/login.html?模板,我就能顯示登錄頁面啦!”

報錯解決小劇場

你訪問?/accounts/login/?,Django 大喊:“找不到?registration/login.html?模板!”
你:“哦~ 原來要自己創建這個文件!”
于是你在?beifan/templates/registration/?里創建?login.html?,要么自己寫內容,要么繼承?admin/login.html?,問題解決!

三、🎨 什么是Django 模板?

模板就是?“HTML 半成品 + Django 魔法標記”?,讓你能把 Python 數據(比如模型數據、變量)動態渲染到網頁里~?

模板是干啥的?

想象你要做 100 個 “用戶訂單詳情頁”,每個頁面的結構一樣(比如標題、表格),但數據不同(訂單號、商品、價格)。

  • 如果純手寫 HTML ,得復制 100 個文件,改數據 → 超麻煩!
  • 用 Django 模板 → 寫一個 “模板文件”(HTML 框架 + 動態標記),然后傳不同數據進去,自動生成 100 個頁面!

?

模板長啥樣?(結構拆解)

1. 普通 HTML 部分(靜態內容)
<!DOCTYPE html>
<html>
<head><title>我的頁面</title>
</head>
<body><h1>歡迎來到我的網站!</h1><p>這是一段固定不變的文字~</p>
</body>
</html>

  • 這部分和普通 HTML 一樣,是靜態內容(所有用戶看到的都一樣)~

?

2. Django 魔法標記(動態內容)
<!DOCTYPE html>
<html>
<head><title>{{ page_title }}</title>  <!-- 動態標題 -->
</head>
<body><h1>歡迎 {{ user_name }} 來到我的網站!</h1>  <!-- 動態用戶名 --><p>你的訂單號是:{{ order.id }}</p>  <!-- 動態訂單號 -->{% if user.is_vip %}  <!-- 條件判斷 --><p>你是 VIP 用戶,享受專屬優惠~</p>{% endif %}{% for product in products %}  <!-- 循環遍歷 --><li>{{ product.name }} - 價格:{{ product.price }}</li>{% endfor %}
</body>
</html>

  • {{ 變量 }}插入 Python 變量(比如?page_titleuser_name?),把后端數據動態渲染到 HTML 里~
    類比:在 HTML 里 “挖個坑”,讓后端傳數據填進來~

  • {% 標簽 %}控制邏輯(比如?if?判斷、for?循環 ),讓 HTML 能根據后端數據 “動態變化”~
    類比:給 HTML 加 “魔法指令”,讓它能判斷、循環,變聰明~

?

模板的作用(為啥需要它?)

1. 分離前后端
  • 后端(Python)負責 “處理數據、業務邏輯”,前端(HTML)負責 “頁面展示”~
  • 模板就是 “橋梁”:讓后端把數據傳給前端,前端用 HTML + 魔法標記展示數據~
2. 復用代碼
  • 一個模板可以渲染?N 個頁面(傳不同數據就行),不用重復寫 HTML 結構~
3. 動態交互
  • 結合?{{ }}?和?{% %}?,讓頁面能根據用戶、數據的不同,展示不同內容~

?

模板的使用流程(小劇場)

1. 后端準備數據

from django.shortcuts import renderdef my_view(request):# 準備要傳給模板的數據(字典形式)context = {'page_title': '我的動態頁面','user_name': '北凡','order': {'id': 123},'user': {'is_vip': True},'products': [{'name': '魔法棒', 'price': 99},{'name': '仙女裙', 'price': 199},]}# 渲染模板,把 data 傳給模板return render(request, 'my_template.html', context)

?

2. 前端模板?my_template.html?接收數據

<!DOCTYPE html>
<html>
<head><title>{{ page_title }}</title>
</head>
<body><h1>歡迎 {{ user_name }} 來到我的網站!</h1><p>你的訂單號是:{{ order.id }}</p>{% if user.is_vip %}<p>你是 VIP 用戶,享受專屬優惠~</p>{% endif %}<h3>你的商品:</h3><ul>{% for product in products %}<li>{{ product.name }} - 價格:{{ product.price }}</li>{% endfor %}</ul>
</body>
</html>

?

3. 最終渲染的 HTML(用戶看到的)

<!DOCTYPE html>
<html>
<head><title>我的動態頁面</title>
</head>
<body><h1>歡迎 北凡 來到我的網站!</h1><p>你的訂單號是:123</p><p>你是 VIP 用戶,享受專屬優惠~</p><h3>你的商品:</h3><ul><li>魔法棒 - 價格:99</li><li>仙女裙 - 價格:199</li></ul>
</body>
</html>

?

模板的存放位置

Django 會在這些地方找模板:

  1. 項目根目錄的?templates?文件夾(適合全局模板)
  2. 每個 App 目錄下的?templates?文件夾(適合 App 專屬模板)

比如你的 App 叫?beifan?,模板可以放在:

beifan/
└── templates/└── beifan/└── my_template.html

?

總結

模板就是?“會魔法的 HTML”?,通過?{{ }}?插變量、{% %}?寫邏輯,讓后端數據能動態渲染到前端頁面里~

它讓前后端分離更清晰、代碼復用更方便、頁面交互更靈活~ 掌握模板,就能做出 “千人千面” 的動態網頁啦! 🎉

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91752.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

winscp 連openwrt 返回127錯誤碼

winscp 連openwrt 24.10返回127錯誤碼。找了許多原因也沒搞清為啥&#xff08;客戶端加密方式、winscp版本過低等都試過&#xff09;&#xff0c;用SecureFx試了一下&#xff0c;發現是openwrt 24.10固件沒有安裝Sftp服器&#xff0c;用下列命令安裝即可。opkg install openssh…

Python編程基礎與實踐:Python文件處理入門

Python文件處理實戰 學習目標 通過本課程的學習&#xff0c;學員將掌握如何在Python中打開、讀取、寫入和關閉文件&#xff0c;了解文本文件和二進制文件的區別&#xff0c;以及在文件處理中的一些最佳實踐。 相關知識點 Python文件處理 學習內容 1 Python文件處理 1.1 文件的基…

Corrosion2靶機

打開靶機信息收集&#xff1a;kali里使用arp-scan -l或者netdiscover發現主機使用nmap掃描端口nmap -sS -sV -T4 -n -p- 192.168.31.20開啟了22、80、8080端口 8080發現開啟了tomcat服務掃出了他的ip以及他開放的端口&#xff0c;我們接下來拿瀏覽器訪問一下兩個頁面都沒有什么…

編程與數學 03-002 計算機網絡 18_物聯網與網絡

編程與數學 03-002 計算機網絡 18_物聯網與網絡一、物聯網的基本概念&#xff08;一&#xff09;物聯網的架構與層次&#xff08;二&#xff09;物聯網的關鍵技術二、物聯網網絡的構建&#xff08;一&#xff09;物聯網網絡的通信協議&#xff08;二&#xff09;物聯網網絡的拓…

【Kubernetes】ConfigMap配置管理:存儲配置參數,創建到容器掛載

在Kubernetes中&#xff0c;配置管理是應用部署的重要環節。ConfigMap作為存儲非敏感配置數據的資源對象&#xff0c;能幫助我們實現"配置與代碼分離"&#xff0c;讓應用部署更靈活。一、什么是ConfigMap&#xff1f; ConfigMap是Kubernetes中用于存儲非加密配置數據…

Promise和回調地獄

順序執行 vs. 異步操作&#xff1a; 當我們說“順序執行”&#xff0c;通常是指 操作按順序發生。而 異步操作 指的是操作在后臺執行&#xff0c;不會阻塞其他操作&#xff0c;通常會使用回調、Promise 或 async/await 來處理結果。 在 Promise 鏈式調用 的情況下&#xff0c;雖…

LeetCode 65:有效數字

LeetCode 65&#xff1a;有效數字問題本質與挑戰 需判斷字符串是否為有效數字&#xff0c;規則涉及整數、小數、指數&#xff08;e/E&#xff09;的復雜組合&#xff0c;如&#xff1a; 整數&#xff1a;123、-45、678小數&#xff1a;1.2、.3、4.、5.6指數&#xff1a;1e10、2…

數據結構之順序表應用與雙指針法

元素刪除通過元素移動的方式來模擬刪除操作&#xff1a;將指定下標后的所有元素依次向前移動一位&#xff0c;覆蓋要刪除的元素&#xff0c;從而達到 "刪除" 的效果。 通過自定義函數實現刪除功能&#xff0c;需要傳入數組、數組長度的指針&#xff08;因為要修改長度…

Python編程基礎與實踐:Python基礎數據類型入門

Python變量與數據類型實踐 學習目標 通過本課程的學習&#xff0c;學員可以掌握Python中變量的基本概念&#xff0c;了解并能夠使用Python的基本數據類型&#xff0c;包括整型、浮點型、字符串和布爾值。此外&#xff0c;學員還將學習如何在實際編程中聲明和使用這些數據類型。…

深入解析C/C++函數變量傳遞:棧、堆與全局變量的生命周期之旅

資料合集下載鏈接: ?https://pan.quark.cn/s/472bbdfcd014? 在編程學習中,函數是構建程序的基石,而理解變量如何在函數之間正確、安全地傳遞,則是從入門到進階的關鍵一步。我們經常會遇到這樣的困惑:為什么一個指針在某個函數里工作正常,傳遞給另一個函數后卻變成了“…

Ubuntu18網絡連接不上也ping不通網絡配置問題排查與解決方法

Ubuntu 18啟動以后發現連接不上網絡,執行 ip a命令或者ifconfig都顯示不了正確的地址(192.168.xxx.xxx)。 剛裝好系統是沒問題的,打算使用FTP開啟ftp服務與windows互傳文件,安裝了net-tools插件就突然連不上網絡了,懷疑是網絡配置被修改了。 經過了一段時間折騰終于解決了,…

【計算機網絡】Socket網絡編程

目錄 一、主機字節序列和網絡字節序列 二、套接字地址結構 1、IPv4 地址結構 (sockaddr_in) 2、IPv6 地址結構 (sockaddr_in6) 3、通用套接字地址結構 (sockaddr) 4、Unix域套接字地址結構 (sockaddr_un) 5、專用 socket 地址結構 6、套接字地址結構的轉換 字符串轉二進制地址 …

網頁操作自動化解決方案:如何用Browser-Use+CPolar提升企業運營效率

文章目錄前言1. 安裝Ollama2. Gemma3模型安裝與運行3. 虛擬環境準備3.1 安裝Python3.2. 安裝conda4. 本地部署Brower Use WebUI4.1 創建一個新conda環境4.2 克隆存儲庫4.3 安裝依賴環境4.4 安裝瀏覽器自動化工具4.5 修改配置信息5. 本地運行測試6. 安裝內網穿透6.1 配置公網地址…

Pycharm的設置過程

20250802 用于記錄pycharm的設置過程 編輯器相關 python語言設置文件注釋 在設置的編輯器部分&#xff0c;按照需求設置模板&#xff01; 函數生成注釋

GaussDB as的用法

通過使用 SQL&#xff0c;可以為表名稱或列名稱指定別名&#xff08;Alias&#xff09;。1 別名的作用SQL 別名用于為表或表中的列提供臨時名稱。 SQL 別名通常用于使列名更具可讀性。 SQL 一個別名只存在于查詢期間。 提高SQL執行效率與編寫SQL代碼效率。2 使用別名的場景在下…

Prim算法

一&#xff0c;prim算法邏輯1.理解&#xff1a;克魯斯卡爾算法關注的是邊&#xff0c;普里姆算法關注的是點把圖中每個頂點比作孤島&#xff0c;點亮一座孤島就可以解鎖附近的孤島每次解鎖的點都是離自身最近的點2.普里姆算法流程a.采用鄰接矩陣表示&#xff0c;考慮要查找最小…

嵌入式學習之硬件——51單片機 1.0

一、基礎知識1.什么是嵌入式&#xff1f;嵌入式以應用為中心&#xff0c;計算機技術為基礎&#xff0c;軟硬件可裁剪的專用計算機系統&#xff1b;2.嵌入式的應用&#xff1f;消費電子、無人駕駛、儲能、新能源........3.嵌入式發展&#xff1f;&#xff08;1&#xff09;第一階…

51c大模型~合集161

自己的原文哦~ https://blog.51cto.com/whaosoft/14079111 #這家國內公司&#xff0c;在給xx智能技術棧做「通解」 打通機器人智能化的關鍵&#xff1a;眼腦手。 xx智能&#xff08;Embodied Intelligence&#xff09;是 AI 領域里熱度極高的賽道&#xff1a;給大模型…

Linux9 root密碼修改

開機按e進入在linux行即quiet后面輸入rd.break ctrlx進入內核輸入mount -o remount,rw /sysrootchroot /sysrootpasswd root即可修改密碼輸入touch /.autorelabelexitexit等待即可

提示詞增強工程(Prompt Enhancement Engineering)白皮書草稿

提示詞增強工程&#xff08;Prompt Enhancement Engineering&#xff09;白皮書草稿 作者&#xff1a; 技術人進化社 Email&#xff1a;2819699195qq.com 日期&#xff1a; 2025年7月30日 1. 引言 隨著大型語言模型&#xff08;LLM&#xff09;能力的飛速發展&#xff0c;如何高…