首页 > 技术文章 > diango—auth模块

WM2019 2019-12-05 23:33 原文

1、什么是auth模块

1、auth模块是django自带的用户认证模块

2、内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据

3、提供了对auth_user表的注册、登陆、认证、注销、修改密码等功能

2、常用方法

导入模块

from django.contrib import auth
from django.contrib.auth.models import User 
# User继承了AbstractUser,在AbstractUser中有auth_user表的字段定义

from django.contrib.auth.decorators import login_required 
# 装饰器:校验是否登陆

1、创建用户

def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # models.User.objects.create(username=username,password=password)
        # User.objects.create(username=username,password=password)  # 不可用  密码不是加密的
        # User.objects.create_user(username=username,password=password)  # 创建普通用户    密码自动加密
        # User.objects.create_superuser(username=username,password=password,email='123@qq.com')  # 创建超级用户   需要邮箱数据
        return HttpResponse('OK')
    return render(request,'register.html')

2、校验用户名和密码是否正确

#  username和password两个参数,缺一不可
user_obj = auth.authenticate(request,username=username,password=password)

3、保存用户登陆状态

# 执行此代码,代替你完成cookie/session操作,保存用户状态
auth.login(request,user_obj)

4、判断当前用户是否登陆

# 用当前已保存的登陆用户request.user执行方法,判断是否仍然登陆者
request.user.is_authenticated()

5、校验原密码是否正确

# 有的操作需要用到确认原密码的操作,如修改密码
request.user.check_password(old_password)

6、修改密码

# 一般与check_password联用
request.user.set_password(new_password)
request.user.save()  # 更新到数据库,必不可少

7、注销

# 秩序执行此代码就可实现注销用户
auth.logout(request)

8、检验用户是否登陆的装饰器

from django.contrib.auth.decorators import login_required

# 局部配置
@login_required(login_url='/login/')
def index(request):
    pass

# 全局配置
# settings配置文件中 直接配置
LOGIN_URL = '/login/'
@login_required
def index(request):
    pass

# 如果全局配置了 局部也配置  以局部的为准

3、扩展auth_user表

注意点:

1、如果要保持扩展之后的auth_user表仍然拥有auth模块的强大功能,必须在扩展之后再使用数据库迁移同步命令,创建真正的表

2、在定义完扩展表之后,如果是继承的方式,那么将要使用auth模块功能的表不在是User,需要到settings.py文件中将配置改成扩展之后的表

AUTH_USER_MODEL = 'app01.Userinfo'  # 应用名.表名

# 在settings.py中添加这条语句之后,由于django配置文件加载的特点,将会覆盖django的全局配置中的AUTH_USER_MODEL

1、利用一对一外键字段关系

from django.contrib.auth.models import User
# auth_user是创建完成之后,在数据库中的真实的表
# 但是在django中对应的模型表类是User,因此要将User导入到models.py中,才能与之建立外键

class UserDetail(models.Model):
    # 注意,不要定义User表中已有的字段
    phone = models.BigIntegerField()
    user = models.OneToOneField(to='User')  

2、利用继承关系

from django.contrib.auth.models import AbstractUser
'''
1、User表继承于AbstractUser,字段真正定义的地方是在AbstractUser
2、此处也可以用User表
3、继承关系扩展表,需要在settings.py文件中添加配置AUTH_USER_MODEL = 'app01.Userinfo'
'''python
class Userinfo(AbstractUser):
    phone = models.BigIntegerField()
    register_time = models.DateField(auto_now_add=True)


# 注意,此处不能继承User,涉及到基表的概念,如下

3、基表


from django.db import models

'''
1、在模型表中定义类种类Meta,设置属性abstract = True

2、基表为抽象表,是专门用来被继承,提供共有字段的,自身不会完成数据库迁移

3、直接继承基表的类,在数据库迁移时,才会创建基表中的字段
'''
class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False)
    created_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        abstract = True  
        
class Book(BaseModel):
    pass

class Publish(BaseModel):
    pass

推荐阅读