Django 之Auth模块

一、Auth 模块是什么


Auth 模块是Django中自带的用户认证模块。

一个网站系统需要实现用户注册、用户登录、用户认证、注销、修改密码等功能,Django中内置了强大的认证系统-auth,默认使用 auth_user 表来存储用户的数据。

同时Django有一个后台管理系统(127.0.0.1:8000/admin),使用的用户名和密码也是这张数据表中的数据。

默认后台管理的用户名和密码是没有的,需要我们创建一个出来,而且只有超级管理员才能登录这个页面,那我们现在就来创建这样一个超级用户。

 

二、扩展默认的 auth_user 表


在一个新的项目中,先设计项目的数据库,表关系,Django 系统内置的认证系统(auth_user表)很好用,但是表字段都是固定的几个,无法进行对它扩展。

比如,默认字段不够我们使用,我们可以对其进行拓展,存储用户手机号、时间等字段,设置表和表之间关系,怎么办?

现在就来设计扩展一下这个表,需要两步

1 配置settings

在 settings.py 配置文件中增加一句话,告诉Django 使用新定义的 UserInfo 表来做用户认证的表。

# settings.py
# 声明使用自定义表作为用户验证,声明格式为: 应用名.表名,继承使用时需要设置
AUTH_USER_MODEL = 'app.UserInfo'

2 配置models

创建一个自定义类并继承AbstractUser类,然后编写 AbstractUser 类中没有的字段并且'不能冲突'。

# app/models.py
from django.db import models
# 导入AbstractBaseUser类,继承AbstractBaseUser类,基本字段
from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    '''
    扩展用户信息表
    继承原有的auth_user表字段
    '''
    nid = models.AutoField(primary_key = True)
    phone = models.CharField(max_length = 11, blank = True, null = True, unique = True, verbose_name = "手机号")
    avatar = models.FileField(upload_to = "avatar", default = "avatar/default.png")
    create_time = models.DateField(auto_now_add = True)
    blog = models.OneToOneField(to = 'Blog', null = True, to_field = 'bid', on_delete = models.CASCADE)
    
    class Meta:
        verbose_name_plural = '用户表'
    def __str__(self):
        return self.username
    
class Blog(models.Model):
    bid = models.AutoField(primary_key = True)
    site_name = models.CharField(verbose_name = "站点名称", max_length = 32)
    site_title = models.CharField(verbose_name = "站点标题", max_length = 32)
    site_theme = models.CharField(verbose_name = "站点样式", max_length = 255)
    def __str__(self):
        return self.site_name

最后,执行两条数据库迁移命令。

python manage.py makemigrations
python manage.py migrate

 注意:所在的库必须是第一次执行迁移命令才可以,若是原本有残留会 引起异常。

 

三、创建超级用户


默认后台管理的用户名和密码是没有的,需要我们创建一个出来,而且只有超级管理员才能登录这个页面,那我们现在就来创建这样一个超级用户

python manage.py createsuperuser

 

四、Auth 模块常用方法


1 auth模块常用方法

from django.contrib import auth

 

2 authenticate()

校验用户名和密码是否正确,可以用来判断当前是否登录,也就是否有session数据。

from django.shortcuts import render, HttpResponse, redirect
from django.contrib import auth
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = auth.authenticate(request, username=username, password=password)
        print(user_obj)
        if user_obj:
            # 保存用户状态
            auth.login(request, user_obj)
            return HttpResponse('OK')
    return render(request, 'login.html')

authenticate方法如果认证成功(用户名和密码正确有效,就是去 UserInfo 表中查询一下是否存在这条记录),便会返回一个 User 对象,查询认证失败返回None。

templates/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <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>
</body>
</html>

 

3 login(HttpRequest, user)

该函数接受一个 HttpRequest 对象,以及一个经过认证的 User 对象。

可以在验证成功后进行登录,它本质上会在后端为该用户生成相关session数据。

# 保存用户状态,相当于设置 session 值。
# 只要执行了此操作,后面的视图函数只要能够拿到request就可以通过 request.user 获取到当前的用户对象。
auth.login(request, user_obj)

 

4 logout(request)

该函数接受一个HttpRequest对象,无返回值。注销。

当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

def logout(request):
    # 类似于request.session.flush()
    auth.logout(request)
    return redirect('/login/')

 

5 is_authenticated()

用来判断当前请求是否通过了认证。

def home(request):
    print(request.user)  # 用户对象     AnonymousUser匿名用户
    print(request.user.is_authenticated())
    if not request.user.is_authenticated():
        return redirect('/home/')
    return redirect('/register/')

 

6 login_requierd()

校验用户是否登录的装饰器。

判断当前用户是否登录那种方式很复杂,需要再每个功能函数中写上这么一段,那么auth模块也帮我们提供了一个现成的登录认证装饰器。

from django.contrib.auth.decorators import login_required
# auth 模块提供的登录装饰器提供两个配置: 局部配置和全局配置

# 局部配置
@login_required(login_url='/login/') # 用户没有登录会跳到login页面
def home(request):
    # if not request.user.is_authenticated:
    #     return redirect('/login/')
    return HttpResponse('欢迎来到home页面')

# 全局配置:
# settings.py配置文件中配置
LOGIN_URL = '/login/'

# 如果全局配置和局部配置都设置了,那么会以局部配置优先。

 

7 create_superuser()

auth 提供的一个创建新普通用户/超级管理员用户的方法,需要提供必要参数(username、password)等。

from app import models

# 操作auth_user表写入数据
def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        
        # 写入数据不能用create密码没有加密处理
        # models.UserInfo.objects.create(username=username, password=password)  
        
        # 创建普通用户
        # models.UserInfo.objects.create_user(username=username, password=password)

        # 创建超级用户(了解):使用代码创建超级用户 邮箱是必填的 而用命令创建则可以不填
        models.UserInfo.objects.create_superuser(username=username, password=password, email='iyuyi.xyz@gmail.com')
    return render(request, 'register.html')

templates/register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Register</title>
</head>
<body>
    <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>
</body>
</html>

 

8 check_password()

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回True,否则返回False。

 

9 set_password

auth 提供的一个修改密码的方法,接收新密码作为参数,校验原密码并修改密码。

def set_password(request):
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        confirm_password = request.POST.get('confirm_password')
        # 先校验两次密码是否一致
        if new_password == confirm_password:
            # 校验老密码对不对
            is_right = request.user.check_password(old_password)
            if is_right:
                # 修改密码
                request.user.set_password(new_password)  # 仅仅是在修改对象的属性
                request.user.save()  # 将修改操作保存到数据库
        return redirect('/login/')
    return render(request, 'set_password.html', locals())

templates/set_password.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>密码修改</title>
</head>
<body>
    <form action="" method="post">
        {% csrf_token %}
        <p>username:<input type="text" name="username" disabled value="{{ request.user.username }}"></p>
        <p>old_password:<input type="text" name="old_password"></p>
        <p>new_password:<input type="text" name="new_password"></p>
        <p>confirm_password:<input type="text" name="confirm_password"></p>
        <input type="submit">
    </form>
</body>
</html>

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path(&#39;authors/$&#39;, views.AuthorView.as_view()), re_path(&#39;book/(?P\d+)/$&#39;, vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = &#39;&#39;&#39; &lt;li&gt;&lt;s
view.py 配置 html 配置
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 &gt; 依赖jQuery文件 实例--&gt;GET请求: 手动发送 &gt; 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render