auth 简介
Django内置了强大的用户认证系统auth,它默认使用 auth_user 表来存储用户数据。
在INSTALLED_APPS中
添加'django.contrib.auth'
使用该APP, auth模块默认启用。
auth 模块
-
创建超级用户:
python manage.py createsuperuser
-
auth.authenticate()
:验证用户名和密码是否正确,一般需要username、password,认证成功返回一个User对象。 -
auth.login()
:将认证通过后的User对象注入request.user属性,会在后端为该用户生成相关session数据。 -
auth.logout()
:调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。 -
is_authenticated()
:判断是否认证。 -
login_requierd()
:auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。-
若用户没有登录,则会跳转到django默认的 登录URL
'/accounts/login/'
并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。
LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由
-
-
create_user()
:创建一个新用户,需要username、password等。 -
create_superuser()
:创建一个超级用户。 -
check_password()
:检查密码是否正确。 -
set_password()
:修改密码,设置完一定要调用用户对象的save方法。
简单示例
from django.shortcuts import render, redirect, HttpResponse
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
# 登录
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
# 验证用户名以及密码是否正确
user = auth.authenticate(username=username, password=password)
if user:
# 将验证的用户注入request.user属性
auth.login(request, user)
return redirect('/my_auth/home/')
else:
pass
return render(request, 'login.html')
# 首页
@login_required
def home(request):
username = request.user.username
return HttpResponse('hello {}'.format(username))
# 注册
def register(request):
User.objects.create_user(username='小黑', password='xiaohei123')
return HttpResponse('ok!')
# 注销
def logout(request):
auth.logout(request)
return redirect('/my_auth/login/')
# 修改密码
def change_password(request):
user = request.user
if request.method == 'POST':
old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')
# 检查旧密码是否正确
if user.check_password(old_password):
# 修改密码
user.set_password(new_password)
user.save()
return HttpResponse('修改密码成功')
else:
return HttpResponse('原密码错误')
return render(request, 'change_password.html')
扩展auth_user
表
定义一个Model类,重新生成数据库
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
phone = models.CharField(max_length=11)
address = models.CharField(max_length=30)
在setting.py
中设置
# 引用Django自带的User表,继承使用时需要设置
AUTH_USER_MODEL = "app.UserInfo"
创建普通用户:
UserInfo.objects.create_user(username='用户名', password='密码')
一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。