Django之auth认证模块
目录
前戏:
django自带一个admin路由 但是需要我们提供管理员账号和密码
如果想要使用admin后台管理 需要先创建表 然后创建管理员账号,直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表
auth模块封装了cookie和session还有很多之前学过的方法,只需要学会如何使用auth模块,如何调用它封装的方法即可
如何创建创建超级管理员?
python38 manage.py createsuperuser
不能直接在终端建普通用户
auth模块的使用
基于auth_user表编写用户相关的各项功能,这里就需要借助于auth模块
登录、校验用户是否登录、修改密码、注销登录等
接下来就介绍auth模块的方法如何使用,主要实现下面这几个功能,URL视图层显示:
# auth用户注册
path('register/', views.register_func),
# auth用户登录
path('login/', views.login_func),
# 网站首页
path('home/', views.home_func),
# index页面 只有登录的用户才可以看
path('index/', views.index_func),
# auth用户修改密码
path('set_pwd/', views.set_pwd_func),
# auth用户退出登录
path('logout/', views.logout_func)
auth之用户注册
在写方法之前,需要先导入两个模块
from django.contrib import auth
from django.contrib.auth.models import User
views函数
def register_func(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 1.校验用户名是否存在 res = <QuerySet [<User: yzk>]>
res = User.objects.filter(username=username)
if res:
return HttpResponse('该用户已经存在')
# 2.注册该用户
# create方法不可以使用,因为密码不加密
# User.objects.create(username=username, password=password)
# create_user方法会自动对密码加密
User.objects.create_user(username=username, password=password)
return render(request, 'registerPage.html')
html页面
<form action="" method="post">
{% csrf_token %}
<p>
username:
<input type="text" name="username">
</p>
<p>
password:
<input type="text" name="password">
</p>
<input type="submit">
</form>
auth模块之登录
request.user方法介绍
该方法如果用户是登录过后,则是用户对象,如果没有登录,则是匿名用户
request.user.is_authenticated
判断当前用户是否已经登录,返回是bool值
views视图函数
def login_func(request):
print(request.user)
print(request.user.is_authenticated)
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 1.校验用户名和密码是否正确(不分开校验) 自己无法比对密码 必须要使用auth模块提供的方法才可以
# 这里是方法里面调用了__str__魔法,返回一个真实的登录对象名字
user_obj = auth.authenticate(request, username=username, password=password)
# print(user_obj) # yzk1
# print(user_obj.username) # yzk1
# print(user_obj.password) # pbkdf2_sha256$150000$1M0w3apWMYbt$Qno5MJoPyOTkGVUQOdCi5PK0G21RLq62RCHjljB/AYg=
if user_obj:
# 2.用户登录成功(返回给客户端登录的凭证、令牌、随机字符串)
auth.login(request, user_obj) # 自动操作django_session表
'''
当执行完上述的操作之后 我们就可以通过request.user直接获取当前登录的用户对象数据
'''
return HttpResponse('登录成功')
return render(request, 'loginPage.html')
html页面
<form action="" method="post">
{% csrf_token %}
<p>
username:
<input type="text" name="username">
</p>
<p>
password:
<input type="text" name="password">
</p>
<input type="submit">
</form>
auth模块之网页首页
views视图函数
def home_func(request):
print(request.user.is_authenticated)
print(request.user)
return render(request, 'homePage.html', locals())
html页面
{% if request.user.is_authenticated %}
<h1>{{ request.user.username }}</h1>
{% else %}
<a href="">注册</a>
<a href="">登录</a>
{% endif %}
auth模块之用户登录过直接跳转页面
需要导入装饰器
校验用户是否登录装饰器
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/') 局部配置
@login_required 全局配置
配置文件中LOGIN_URL = '/login/'
出现找到页面的问题,所以导入装饰器的时候,要指定路径
views视图函数
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/') # 可以明确指定用户没有登录之后跳转到哪个地址
def index_func(request):
return HttpResponse('index页面 只有登录的用户才可以查看')
auth模块之用户修改密码
views视图函数层
@login_required(login_url='/login/')
def set_pwd_func(request):
if request.method == 'POST':
old_pwd = request.POST.get('old_pwd')
new_pwd = request.POST.get('new_pwd')
confirm_pwd = request.POST.get('confirm_pwd')
if not new_pwd == confirm_pwd:
return HttpResponse('两次密码不一致')
# 1.判断原密码是否正确
is_right = request.user.check_password(old_pwd)
if not is_right:
return HttpResponse('原密码不正确')
# 2.修改密码
request.user.set_password(new_pwd)
request.user.save() # 一定要保存 否则不会修改
return HttpResponse('修改密码成功')
return render(request, 'setPage.html')
html
<form action="" method="post">
{% csrf_token %}
<p>原密码:
<input type="text" name="old_pwd">
</p>
<p>新密码:
<input type="text" name="new_pwd">
</p>
<p>确认密码:
<input type="text" name="confirm_pwd">
</p>
<input type="submit">
auth模块之注销用户
views视图函数
@login_required
def logout_func(request):
auth.logout(request)
return HttpResponse('退出登录')
auth模块之扩展表
还想使用auth模块的功能 并且又想扩展auth_user表的字段
-
思路1:一对一字段关联(外键)
-
思路2:替换auth_user表
步骤1:模型层编写模型类继承AbstractUserfrom django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): # 填写AbstractUser表中没有的字段 phone = models.BigIntegerField() desc = models.TextField()
步骤2:一定要在配置文件中声明替换关系
AUTH_USER_MODEL = 'app01.UserInfo'
ps:替换还有一个前提 就是数据库迁移没有执行过(auth相关表没有创建)