首页 > 其他分享 >Django-auth认证模块

Django-auth认证模块

时间:2022-12-25 14:45:01浏览次数:46  
标签:username return request auth Django user 模块 password

1.auth认证模块

1.django自带一个admin路由,但是需要我们自己填写管理员账号和密码。如果想要是用django的admin后台管理,首先需要创建表(直接执行数据库迁移命令会默认产生auto_user表:
python38 manage.py makemigrations
python38 manage.py migrate
)。

2.创建超级管理员:
python38 manage.py createsuperuser

3.基于auth_user表编写用户相关的各项功能:
	登录、校验用户是否登录、修改密码、注销登录等(相当于django封装好了一些表和功能供我们使用)

2.auth认证相关模块及操作

1.用户注册功能:
导入User表: 
from django.contrib.auth.models import User  
查看表中是否已有该用户(包括管理员)(拿到的结果是一个queryset或None):
res = User.objects.filter(username=username)
创建用户:(密码密文保存)User.objects.create_user(username=username,password=password)

from django.contrib.auth.models import User    
def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        con_pwd = request.POST.get('con_pwd')
        if not password == con_pwd:
            return HttpResponse('两次密码输入不一致')
        res = User.objects.filter(username=username)
        if res:
            return HttpResponse(f'用户{username}已注册')
        User.objects.create_user(username=username,password=password)
    return render(request,'register.html')

2.登陆功能:auth模块校验只能将用户名和密码一起校验,只有当用户名和密码全部正确的时候返回的才是一个用户对象,验证代码为:
from django.contrib import auth
    target_path = request.GET.get('next')
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = auth.authenticate(request,username=username,password=password)
        if user_obj:
            auth.login(request,user_obj)
            if not target_path:
                return HttpResponse('登陆成功')
            else:
                return redirect(target_path)
        return HttpResponse('用户名或密码错误')
    return render(request,'login.html')

我们可以使用request.user来查看登陆的用户是谁,如果已登录,那么print(request.user)的结果就是用户名,未登录就是AnonymousUser。
同样我们也可以用request.user.is_authenticated将是否登陆用布尔值表示:如果已有用户登录,print(request.user.is_authenticated)结果是True,未登录则是Flase。

3.模拟博客园效果:当用户登陆时,展示用户的姓名,当用户未登录时,展示的是注册和登陆两个标签:
views.py
def home_func(request):
    return render(request,'homePage.html',locals())
    
homePage.html:    
<body>
    {% if request.user.is_authenticated %}
        {{ request.user.username }}  # user是固定语法,不随表名改变而改变
     {% else %}
        <a href="/register/" >注册</a>
        <a href="/login/">登陆</a>
    {% endif %}
</body> 

4.如果某个页面只有登录之后才能查看,根据昨天学习的内容我们可以写一个装饰器并且在路由后面加一个问号再加一个键值对来表示本来想要访问的页面。在auth模块中这些内容都已被封装好:
首先导入模块:
from django.contrib.auth.decorators import login_required
如果登录页面的路由和我们制定的不一样,我们可以在括号内指定登陆路由:
@login_required(login_url='/login/')
def index_func(request):
    return HttpResponse('index页面,只有登录才能查看')

5.如果很多个函数的登陆路由都一样,那么我们可以直接在setting.py中写:
LOGIN_URL = '/login/'
在视图函数中就无须重复指定登陆路由:只要被该装饰器装饰的函数没有登陆之前都会跳转到指定登陆的页面
@login_required
def index_func(request):
    return HttpResponse('index页面,只有登录才能查看')
"""
如果想要登陆之后跳转还需要用到之前的方法:首先用target_path = request.GET.get('next')拿到指定的路径,再分情况如果target_path有值的话就重定向:return redirect(target_path)
"""

6.修改密码:
@login_required  # 修改密码之前必须要获取是哪个用户,所以要先登录
def setpwd(request):
    if request.method == 'POST':
        old_pwd = request.POST.get('old_pwd')
        new_pwd = request.POST.get('new_pwd')
        con_pwd = request.POST.get('con_pwd')
'''request.user.check(字符串密码)用来判断密码是否正确,结果是一个布尔值'''
        is_right = request.user.check_password(old_pwd)
        if not new_pwd == con_pwd:
            return HttpResponse('两次密码输入不一致,无法修改')
        if not is_right:
            return HttpResponse('原密码错误,无法修改')
'''request.user.set_password用来修改密码,修改完之后要保存'''
        request.user.set_password(new_pwd)
        request.user.save()
        return redirect('/login/')
    return render(request,'setpwdPage.html',locals())

7.退出登录:auth.logout(request)可以自动将sessioon表中的对应关系删除。
@login_required
def logout(request):
    auth.logout(request)
    return HttpResponse('成功退出登录')

3.扩展auth_user表

如果相对user表的字段做一些扩展,可以采用新建一张表,并且顶替掉原来的suth_user表:
步骤1:模型层编写模型类继承AbstractUser
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
# 填写AbstractUser表中没有的字段
phone = models.BigIntegerField()
desc = models.TextField()

步骤2:一定要在配置文件中声明替换关系
AUTH_USER_MODEL = 'app01.UserInfo'
ps:替换还有一个前提 就是数据库迁移没有执行过(auth相关表没有创建),数据库迁移已存在的表要删掉

标签:username,return,request,auth,Django,user,模块,password
From: https://www.cnblogs.com/zkz0206/p/17004011.html

相关文章