刨析django----内建用户系统

本文详细介绍了Django自带的用户验证系统,包括用户账号管理、组管理、权限管理及会话保持等功能。涵盖如何创建用户、验证登录、修改密码、会话管理等内容,并提供了实战案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内建系统简介

Django 自带一个用户验证系统,它负责处理用户账号、组、权限和基于cookie的用户会话。

  • django.contrib.auth 认证的应用
    • auth.models.User 用户模型类,处理注册、登录等;
    • auth.models.Group 组模型类,对用户分组,与User是多对多关系;
    • auth.models.Permission 权限模型类,标识某个用户是否有权限操作,与User是多对多关系;
  • user_obj.user_permissions 是与权限的多对多关联字段
    • user_obj.user_permissions.add(perm_obj) 为用户添加权限(也可以通过superuser在管理后台为一个用户添加权限)
    • user_obj.user_permissions.create(name=“权限名称”, codename=“users.add_userarticle”, content_type=content_type_obj) 添加权限;
    • user_obj.user_permissions.all() 查询所有的权限;
    • user_obj.user_permissions.clear() 清空所有的权限;
  • user_obj.groups 是用户与组的多对多关联字段
    • user_obj.groups.add(group_obj) 将用户添加到一个组;
    • user_obj.groups.all() 查询用户所在的组;
    • user_obj.groups.clear() 清空组
  • auth -> authenticate 认证用户的登录
    • 认证成功返回用户对象,否则返回None
  • auth -> login 让用户登录,并基于session进行会话保持;
  • auth -> logout 退出登录;
  • auth.decorators.login_required 装饰器,只装饰视图函数,限制需要登录才可以访问
    • 若未登录,则重定向到(settings.py配置文件中的)LOGIN_URL 地址,也可以指定login_url参数;
    • redirect_field_name参数 默认为‘next’
  • auth.decorators.permission_required 装饰器, 装饰视图函数,限制即使登录后也需要相应的权限,才可以操作
    • perm or perms 参数,表示需要的权限,如“add_userarticle”、[“add_userarticle”, “change_userarticle”, ‘view_userarticle’, ‘delete_userarticle’]。 这里的权限都是app_name.add_模型类小写形式
    • raise_exception, False 时,若无权限则重定向到LOGIN_URL(也可以用login_url参数指定);True时,若无权限则服务端抛出一个PermissionDenied异常,并返回403
  • auth.decorators.user_passes_test 装饰器,装饰视图函数,测试用户是否可以正常访问
    • @user_passes_test(func) 装饰视图函数,其中func是自定义函数 def func(user),内部判断user对象是否合法,合法返回True,否则返回False(重定向到登录页面)

官网参考英文版
使用参考中文版
 

auth认证的表

模型类完成迁移后,在数据库中默认有若干表。
auth_user表,存储用户;
在这里插入图片描述
 
auth_permission表,存储所有模型类的增add、删delete、改change、查view权限
在这里插入图片描述
 
auth_group表,存储用户的组
在这里插入图片描述
 
django_content_type表,将模型类与权限关联
在这里插入图片描述
 
django_migrations表,模型类迁移历史表,删除相关历史后,可以重新执行迁移,而不用删除数据库。
在这里插入图片描述

 

注册时创建用户

  • 直接使用内建的User模型类创建用户对象;
  • 自定义一个User模型类,继承内建的auth.models.AbstractUser,此时可以扩展字段;
#auth 内建的应用
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
	# username/password/email/is_superuser/is_active等属性 直接继承父类
	class Meta:
		db_table = "user_table" # 数据库中的表名
		verbose_name_plural = 'user' # 管理后台展示的名称
	

创建普通用户

直接使用内建的模型类User

# objects 对象管理器 方式
from django.contrib.auth.models import User
user = User.objects.create_user(username="lauf", password="123", email="xxx", is_active=True, is_superuser=False) 
# 以上会对密码,自动加密;而实例化方式不会自动加密
# username必须唯一,自己验证处理或异常捕获
# user.is_active = True  # 控制伪删除
# 保存到default 数据库
user.save() # 若要保存到(配置的)其他数据库,则使用using='primary'关键字参数


# 实例化方式
user2 = User(username="tom", password="tom123", email="xxxx", is_active=True, is_superuser=False)
# 数据库中的密码是明文,并没有加密
# user2.set_password("tom123") # 可以哈希加密
user2.save()

创建超级用户

# 导入User
from django.contrib.auth.models import User
superuser = User.objects.create_superuser(username="lauf", password="123", email="xxxx")
# 必须有email
superuser.save()

用户均保存在auth_user表中

 

登录时验证用户


from djang.contrib.auth import authenticate

#验证用户名、密码,直接传入字符串
user = authenticate(request, username=username, password=password)

if user:   # 验证成功,返回user对象,否则返回None
	return HttpResponse("登录成功")
else:
	return HttpResponse("用户名或密码错误")

 

修改密码


user = User.objects.get(username="lauf") # 注意异常捕获 (只能查询到一条数据,多或者少都异常)
user.password = "456"  # 数据库中保存 456
# 
user.set_password("456") # 数据库中保存 哈希加密

user.save()

 

登录会话保持


from django.contrib.auth import authenticate, login, logout


def deal_login(request):
	username = request.POST.get("username") # str
	password = request.POST.get("password") # str

	#验证user
	user = authenticate(username=username, password=password)
	if user: #验证通过,让其登录
		#登录,并会话保持,默认使用session保持会话
		login(request, user)
		#
		return HttpResponse("登录成功")
	else:
		return HttpResponse("用户名或密码错误")

# 需要登录才能访问的视图
from django.contrib.auth.decorators import login_required


@login_required    #必须登录才可以进入视图,否则重定向 settings> LOGIN_URL="/login"
def index_view(request):
	# 处理业务
	# 获取登录认证的用户
	login_user = request.user   # 未登录的user 为 AnonymousUser  通过.is_authenticated区分
	return HttpResponse("xxxx")
	

 

退出登录

def logout_view(request):
	logout(request)

	return HttpResponse("已退出")

 

实战案例

  1. 注册功能
    路由:/user/reg
    视图: reg_view
    GET,返回注册页面
    POST,使用内建的认证系统,创建用户
  2. 登录功能
    路由:/user/login
    视图:login_view
    使用内建的认证系统 --验证用户,并登录保持
  3. 登出
    路由:/user/logout
    视图:logout_view
    用户登出
  4. 首页功能
    路由:/index
    视图:index_view
    必须登录,才可以显示主页

项目代码
提取码:qidi

 
 

上一篇:刨析django----下载csv文件    下一篇:刨析django----内建用户系统2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值