一、Auth 模块是什么
Auth 模块是 Django 自带的用户认证模块:
在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能。
Django 内置了强大的用户认证系统 --auth,它默认 ** 使用 auth_user 表 ** 来存储用户数据。
二、auth 模块常用的方法
from django.contrib import auth
2.1 authenticate()
提供了用户认证功能,即验证用户名以及密码是否正确,一般需要 username 、password 两个关键字参数。
如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。
authenticate() 会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
用法:
user_obj = authenticate(username='usernamer',password='password')
2.2 login(HttpRequest, user)
该函数接受一个 HttpRequest 对象,以及一个经过认证的 User 对象。
该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关 session 数据 (存放进 session 表)。
用法:
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user_obj = authenticate(username=username, password=password)
if user_obj is not None:
login(request, user_obj)
# Redirect to a success page.
...
else:
# Return an 'invalid login' error message.
...
2.3 logout(request)
该函数接受一个 HttpRequest 对象,无返回值。
当调用该函数时,当前请求的 session 信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
用法:
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
2.4 is_authenticated()
用来判断当前请求是否通过了认证
用法:
def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
2.5 login_required()
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 进行修改。
LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由
2.6 create_user()
auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。
用法:
from django.contrib.auth.models import User
user_obj = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)
# 但是偷懒点的用法是:
user_obj = User.objects.create_user(**kwargs)
# 通常,在校验完数据之后 user_obj.cleaned_data 里面就是键值形式的数据,此时,通过打散就可以作为参数了
2.7 create_superuser()
auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。
用法:
from django.contrib.auth.models import User
user_obj = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
2.8 check_password(password)
auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。
密码正确返回 True,否则返回 False。
用法:
result = user.check_password('密码')
2.9 set_password(password)
auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。
** 注意:设置完一定要调用用户对象的 save 方法!!!**
用法:
user.set_password(password='')
user.save()
2.10 User 对象的属性
User 对象属性:username, password
is_staff : 用户是否拥有网站的管理权限.
is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。
三、扩展默认的 auth_user 表
默认的 auth_user 表字段确实很多,但是万一要是想使用更多的字段该怎么办?
一种方法是,新建一张表,然后将二者进行关联,就可以达到了目的
还有一种方法就是对象里面的继承了。
仔细一看,auth_user 表本身就继承了一个类:AbstractUser,而所有的映射字段都在 AbstractUser 表里面。所以,在继承这个类的基础之上在加上自定义的映射属性就可以无法无天了。
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
# 在原本 auth_user 表里面,肯定也有定义的__str__方法,而且返回的就是 self.name,不信你实例化一个对象打印一下试试,返回的肯定是 username
ps:
按上面的方式扩展了内置的 auth_user 表之后,一定要在 settings.py 中告诉 Django,我现在使用新定义的 UserInfo 表来做用户认证。
并且一但指定了新的自定义的表,需要做的就是执行迁移数据库命令,在数据库中创建自定义的表,并且此时已经不能使用默认的 auth_user 表了。
写法如下:
# 引用 Django 自带的 User 表,继承使用时需要设置
# AUTH_USER_MODEL = "app 名. 类名"
AUTH_USER_MODEL = "app 名. UserInfo"