- 用户模型:用户认证、登录、退出等
- 后台管理:用户管理、权限分配
- Django自带一个用户认证系统,用于处理账号、组、权限以及基于Cookie的用户会话
1.1 安装与配置
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
python manage.py makemigrations
python manage.py migrate
1.2 Auth 用户类型
- 注册用户(User),超级用户,普通用户
- 游客(AnonymousUser)
1.3 Auth 常用字段含义
序号字段说明1
用户名2
登录密码3
邮箱4
姓6is_superuser是否是超级管理员账号/admin7is_staff是否可以访问admin管理后台8is_active是否是活跃用户,默认为True,一般不删除,而是将用用户的is_active设置为False9is_authenticated用户是否已登录的只读属性10is_anonymous用户是否登录失效的只读属性11date_joined用户创建的时间12last_login上一次登录时间13groups用户组多对多关系14user_permission用户权限多对多关系
2.1 创建用户
- *创建普通用户
from django.contrib.auth.models import User
User.objects.create(username="AA",password="123")
User.objects.create_user(username="AA",password="123")
- *创建超级用户
from django.contrib.auth.models import User
User.objects.create_superuser(username="AA",password="123")
2.2 删除用户
建议使用: 伪删除,即将is_active修改为False
from django.contrib.auth.models import User
try:
user = User.objects.get(username = "用户名")
user.is_ active = False
user.save()
print("删除用户成功")
except:
print("删除用户失败,或该用户不存在")
注意: 不可用update来更新,User不能用。
user = User.objects.get(username = "用户名")
user.update(is_active=True)
"""
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'User' object has no attribute 'update'
"""
2.3 密码管理
- 修改密码
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
from django.contrib.auth.models import User
try:
user = User.objects.get(username="用户名")
user.set_password("明文密码")
user.save()
return HttpResponse("修改密码成功")
except:
return HttpResponse("修改密码失败")
- 校验密码是否正确
u = User.objects.get(username='aa')
u.check_password('my password')
3.1 authenticate 登录校验
from django.contrib.auth import authenticate
user = authenticate(username = username,password=password)
说明: 若用户名密码校验成功则返回对应的user对象,否则返回None。
from django.contrib.auth import authenticate
user = authenticate(username="AA",password="123")
user
<User: AA>
3.2 Auth 登录状态保持
from django.contrib.auth import login
from django.contrib.auth import authenticate
def login_view(request):
...
user = authenticate(username="用户名",password="密码")
...
login(request,user)
注: 保存的方式为session,且时间不可以控制,当session什么时候过期,那么就什么时候断开。
3.3 Auth 登录状态校验
同前,用django自带登录状态校验装饰器,实现登录状态的校验。哪个视图需要,就放在哪个视图之前。
- 未登录需要跳转地址,需要在settings.LOGIN_URL中设置
import django.contrib.auth.decorators import login_required
@login_required
def index_view(request):
login_user = request.user
...
3.3 Auth 登录状态取消
from django.contrib.auth import logout
def logout(request):
logout(request)
- 引用的相关库
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.contrib.auth import login,logout,authenticate
def reg_view(request):
if request.method == "GET":
return render(request,"reg_view")
elif request.method == 'POST':
username = request.POST.get("user")
pwd1 = request.POST.get("pwd1")
pwd2 = request.POST.get("pwd2")
if not User.objects.filter(uesename=username):
if pwd1 == pwd2:
user = User.objects.create_user(username=username,password=pwd1)
else:
return HttpResponse("密码不一致,请重新输入")
else:
return HttpResponse("该用户名已注册,请重新输入")
return HttpResponseRedirect("/login")
def login(request):
if request.method == "GET":
return render(request,"login.html")
elif request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
user = authenticate(username=username,password=password)
if not user:
return HttpResponse("用户名或密码错误")
else:
login(request,user)
return HttpResponseRedirect("/index")
def logout(request):
logout(request)
return HttpResponseRedirect("/login")
@login_required()
def index_view(request):
user = request.user
return render(request,"index.html")
当我们要使用如手机号字段时,发现用户字段不够用,这时就需要想办法来增加字段。
- 方案1:通过建立新表,与内建表做一对一验证
- 应用时查询较麻烦
- 方案2:继承内建的抽象
User
模型类 -
继承现有的模型字段到一个新表,将我们的表告知
Django
将原User
模型类替换为SelfUser
模型类 -
step1:添加新应用
- step2:定义模型类,继承
AbstractUser
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
phone = models.CharField(max_length=11,default="")
- step3:
settings.py
中指明AUTH_USER_MODDEL="应用名.类名"
AUTH_USER_MODEL = 'appname.UserInfo'
- step4:最好在 首次执行数据库迁移命令。
注意: 此流程最好要在第一次 migrate
时执行,否则用方案1合适。后面一切调用模型类时就应该是UserInfo这个模型类了。
–添加新用户–
from user.models import UserInfo
user = UserInfo(username="XX",password="xxxx",phone="xxxxxxxx")
Original: https://blog.csdn.net/qq_44285092/article/details/121382080
Author: 而又何羡乎
Title: Django Auth 登录认证
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/734124/
转载文章受原作者版权保护。转载请注明原作者出处!