auth组件

auth组件介绍

auth组件的主要作用就是替我们处理一些登录、注册、验证登录、安全退出的一些功能,

一旦你使用了系统提供的组件,如果不做任何更改,我们的用户信息都会被存到固定的表中auth-user,

而表中的字段也是固定的

auth组件功能

登录

from django.contrib import auth
from django.contrib.auth.models import User
# 首先导入系统的auth组件和auth组件中user的模型表
def login(request):
    if request.method == 'GET':
        return render(request,"login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")

        user = auth.authenticate(request, username=username, password=password)
        # 参数传入用户名和密码,他会去系统表中进行查找,有相同的返回对象,没有就返回None
        if user:
            auth.login(request, user)
            # 调用login系统相当于做了以下三部
            #   1.设置session和cookie
            #   2.生成request.user对象,这个对象是可以在函数视图中使用的(详情见auth中间件)
            #   3.request.user 相当于request.session 
            return render(request, "blog.html")

验证

# 认证有三种方式
#   1.在需要认证的函数中认证
def authority(request):
    is_login = request.user.is_authenticated()
# 如果已经登录就会返回True  没有就返回False

# 2.通过装饰器把认证失败后跳转的url传入
from django.contrib.auth.decorators import login_required
# 导入装饰器
@login_required(login_url="/test/")
def authority(request):
    pass

# 3.全局设置url,不用传参
# 在settings.py 中配置  LOGIN_URL = "/test/"
@login_required
def authority(request):
    pass

注册

def register(request):
    if request.method == 'GET':
        return render(request, "register.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = User.objects.filter(username=username).first()
        # 可以通过这种filter查看是否有该用户名的用户
        if user:
            return HttpResponse("用户名已存在")
        else:
            # 创建普通用户账号
            User.objects.create_user(username=username, password=password)
            # 创建超级用户账号
            User.objects.create_superuser(username=username, password=password)
            return HttpResponse("登录去吧")

修改密码

@login_required
def modify(request):
    # 这里时get请求处理,省略
    oldpwd = request.POST.get("oldpwd")
    newpwd = request.POST.get("newpwd")
    # 判断旧密码是否正确
    res = request.user.check_password(oldpwd)
    if res:
        request.user.set_password(newpwd)
        request.user.save()     # 强调:修改完密码一定要保存,不然不会成功
        return HttpResponse("ok")
    return HttpResponse("oldpwd 错误")

安全退出

@login_required
def logout(request):
    auth.logout(request)     # 会把你缓存和数据库中的session都清除掉
    return HttpResponse("退出完成")

拓展auth表的字段

1. 创建另一张表和auth表一对一关联

from django.db import models
from django.contrib.auth.models import User
class NewUser(models.Model):
    salary = models.CharField(max_length=32, null=True)
    user = models.OneToOneField(to="User")

2. 面向对象,继承auth的表模型

from django.contrib.auth.models import AbstractUser

class NewUser(AbstractUser):
    salary = models.CharField(max_length=32, null=True)
# 并且需要在settings里设置不使用默认的auth表,而是使用我们自己的表
# AUTH_USER_MODEL = "app名.models里对应的模型"
AUTH_USER_MODEL = "app01.NewUser"
原文地址:https://www.cnblogs.com/hesujian/p/11222810.html