【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;如何高…