2.8.5Django --14.4Auth

Django目录:https://blog.csdn.net/qq_41106844/article/details/105554082

什么是Auth组件

auth是django内置的用户认证模块,有数据库模板,登录,注册,注销等功能。
可以方便我们对用户的管理。

用户认证

我们先简要回顾一下我们使用session时的用户认证视图:

from django.shortcuts import render,redirect,HttpResponse
from app01.models import User

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username,password)
        user = User.objects.filter(username=username,password=password)
        if user :
            #登陆成功
            request.session["username"] = username
            request.session["is_login"] = True
            return redirect('/index/')
        else:
            return HttpResponse("登录失败")
    else:
        return render(request,"login.html")

def index(request):
    is_login = request.session.get('is_login')
    if not is_login:
        return redirect('/login/')
    username = request.session.get('username')
    return render(request,"index.html",{"username":username})

我们是通过使用session保存用户名和认证状态来完成用户认证,接下来让我们来是一些auth自带的用户认证组件。

auth_user表

如果使用auth组件,就不得不说auth_user表了。他和我们的django_session表一样是内置表。

 

 
20155953-f8e7a2ffa2e7d6f7.png
auth_user表

 

使用这张表前我们要先创建超级用户来完成用户认证功能:
命令

python manage.py createsuperuser

 
20155953-2fb860f9860ccf28.png
命令

 

然后auth_user表就有了一条数据

 

 

 
20155953-7fd0082bdbcaa319.png
数据库

 

使用auth的代码:

from django.shortcuts import render,redirect,HttpResponse
from django.contrib import auth

def auth_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        #使用auth_user表
        user = auth.authenticate(username=username,password=password)
        #将用户信息封装到请求中  类似session  不过更推荐使用session
        auth.login(request,user)
        if user :
            return redirect('/index/')
        else:
            return HttpResponse("登录失败")
    else:
        return render(request,"login.html")


def index(request):
    username = request.user.username
    if not username:
        return redirect('/login/')
    return render(request,"index.html",{"username":username})        
 
20155953-9b706575b6a8a2bc.png
页面登录

 

这就是一个简单的auth的用户认证.
常用函数:

 

authenticate()

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。

authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

login()

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

该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。

is_authenticated()

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

def my_view(request):
  if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

login_requierd()

auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。

from django.contrib.auth.decorators import login_required
      
@login_required
def my_view(request):
  ...

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

用户的注册与注销

用户的注册就是向auth_user表写入数据

from django.contrib.auth.models import User

def reg(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        #用户注册命令  username 与 password 必须指定
        user = User.objects.create_user(username=username,password=password)
        if user :
            return redirect('/auth_login/')
        else:
            return HttpResponse("注册失败")
    else:
        return render(request,"reg.html")
 
20155953-307c7a9a2f29a161.png
注册页面
 
20155953-cdada7516db6e932.png
数据库截图

注销功能如下:

from django.contrib.auth import logout

def logout_view(request):
    logout(request)
    return redirect('/auth_login/')

常用函数:

create_user(),create_superuser()

注册用户的方法

logout(request)

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

check_password(raw_password)

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

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

ok = user_obj.check_password('密码')

set_password(raw_password)

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

user_obj.set_password('新密码')
user_obj.save()

继承auth_user

这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊!

比如,我想要加一个存储用户手机号的字段,怎么办?

聪明的你可能会想到新建另外一张表然后通过一对一和内置的auth_user表关联,这样虽然能满足要求但是有没有更好的实现方式呢?

答案是当然有了。

我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。

AuthDemo.app01.models.py
------------------------
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    用户信息表
    """
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username

AuthDemo.AuthDemo.settings.py
----------------------------
...
AUTH_USER_MODEL = "app01.UserInfo"
...

之后Userinfo相当于继承了auth_user表及其属性与方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寒 暄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值