Django 内置一个 auth
模块,帮助用户实现注册、登陆、注销以及修改密码等功能,帮助开发者省去了不少功夫。html
在建立模型时,Django内部会生成一个名为 auth_user
的数据表,用于存储认证的用户信息。python
auth
模块提供了一系列的方法,使用以前须要导入:数据库
from django.contrib import auth
提供用户认证功能,验证用户名和密码是否正确等。如验证成功,则返回一个 User
对象。django
from django.contrib import auth def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 用户认证,验证用户名、密码是否正确,并返回一个 user 对象 # username、password 字段对应 auth_user 表中相应字段 user_obj = auth.authenticate(username=username, password=password)
实现用户登陆功能,会在后台为登陆用户生成 session
数据。session
from django.contrib import auth auth.login(request, user_obj) from django.contrib.auth import login login(request, user_obj)
接收两个参数,第一个为 HTTPRequest
对象,以及一个认证过的用户对象(即 authenticate()
认证过的用户对象)。app
from django.contrib import auth def login(request): """登陆""" if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 用户认证,验证用户名、密码是否正确,并返回一个 user 对象 user_obj = auth.authenticate(username=username, password=password) if user_obj: # 将验证成功的用户封装到 request.user 对象中 auth.login(request, user_obj) return redirect('home') else: return '错误信息' return render(request, 'login.html')
认证成功的用户对象,执行 login()
方法,实现登陆功能,不然返回错误信息。工具
Tipsui
执行过 login()
方法的用户对象,就能经过request.user
拿到当前登陆的用户对象,从而取出用户的相关信息,不然取得的将是一个匿名用户对象 AnonymounsUser Object
。加密
login(request, user_obj) # 得到当前登陆用户对象 user = request.user # 得到当前登陆用户对象的用户名 username = request.user.username
该方法实现注销功能,清除当前登陆用户数据库中的 session
数据,接收一个 HttpRequest
对象,无返回值。url
from django.contrib import auth def logout(request): """注销""" auth.logout(request) # 注销后重定向到登陆页面 return redirect('login')
判断当前用户是否经过认证,为布尔值。
def home(request): """首页""" ret = request.user.is_authenticated print(ret) # True
auth 模板提供的一个装饰器工具,可以便捷地为某个视图添加登陆校验。
accounts/login/
,并传递当前访问 url 绝对路径。settings.py
中添加:# 当用户没有登陆,访问某个视图时将会跳转到登陆页面 LOGIN_URL = '/login/'
from django.contrib.auth.decorators import login_required # 添加装饰器 @login_required def home(request): """首页""" return render(request, 'home.html')
当用户访问 home
页面时,若没有登陆则会跳转到登陆页面,不然返回 home
页面。
上面介绍的都是关于登陆相关的,下面将介绍如何建立在 auth_user
中建立用户,修改密码,验证密码等。
该方法用于建立一个超级用户,接收 username、password
两个必要参数。效果与执行 python manage.py createsuperuser
等同。
from django.contrib.auth.models import User user_obj = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
通常状况 create_superuser()
方法不多使用,最常使用的是create_user()
方法,它将会建立一个普通用户,常应用于注册视图中。
建立用户所需字段,应与 auth_user
数据表中字段对应。
from django.contrib.auth.models import User def signup(request): # 建立新用户 user_obj = User.objects.create_user(username='lila', password='1234') return HttpResponse('建立成功')
Tips
新建立的用户,保存在 auth_user
数据表中的密码是通过加密的。
检查登陆用户密码是否正确,须要当前请求用户的密码。
from django.contrib.auth.models import User def signup(request): # 建立新用户 user_obj = User.objects.create_user(username='lila', password='1234') ret = user_obj.check_password('123456') print(ret) # False return HttpResponse('建立成功')
密码正确返回 True,不然返回 False。
或者对当前请求的 user 对象校验原密码是否正确:
obj = request.user.check_password(raw_password='原始密码')
该方法用于修改密码,接收要新密码做为参数,最后必定要执行 save()
方法保存,不然无效。
def set_password(request): """ 修改密码,request.user 中封装了已认证且执行了登陆功能的用户对象 :param request: :return: """ request.user.set_password('12') password = request.user.password request.user.save() print(password) return HttpResponse('修改为功')
修改密码示例
该示例仅适用于已登陆的用户,在内部修改密码,未登陆的用户将跳转到登陆页面。
from django.shortcuts import render, redirect, HttpResponse from django.contrib.auth.decorators import login_required @login_required def set_password(request): """ 修改密码,request.user 中封装了已认证且执行了登陆功能的用户对象 :param request: :return: """ user = request.user ret = {'message': None} if request.method == 'POST': old_password = request.POST.get('old_password') new_password = request.POST.get('new_password') # 重复新密码 repeat_password = request.POST.get('repeat_password') # 检查旧密码是否正确 if user.check_password(old_password): if not new_password: ret['message'] = '新密码不能为空' elif new_password != repeat_password: ret['message'] = '两次密码输入不一致' else: user.set_password(new_password) user.save() return redirect('login') else: ret['message'] = '原密码不正确' return render(request, 'set_password.html', ret)
因为 auth 模板中 auth_user
数据表字段是固定的,所以当咱们使用 auth 模块,想要添加额外的字段时,就须要对其进行拓展。
拓展方法有两种:
auth_user
表一对一关联AbstractUser
类:经常使用models.py
中新建一个类,继承自 AbstractUser
:from django.contrib.auth.models import User, AbstractUser # 导入 AbstractUser 类 class UserInfo(AbstractUser): """ 继承 AbstractUser 新增字段:phone、addr """ phone = models.CharField(max_length=11, verbose_name='手机号码') addr = models.CharField(max_length=128, verbose_name='家庭地址')
settings.py
新增的类继承 AbstractUser
,拓展后将会覆盖 auth_user
表,所以须要配置 settings
,使默认认证知道要使用哪一种表认证。
# settings.py # 在最后添加以下代码 AUTH_USER_MODEL = 'app名.新增的类名' AUTH_USER_MODEL = 'app.UserInfo' # 示例
python manage.py makemigrations python manage.py migrate
拓展 auth 模块后,使用的再也不是原来 auth_user
表,而是新表 app.UserInfo
表,所以在建立用户时应该注意。
# 拓展以前 from django.contrib.auth.models import User user_obj = User.objects.create_user(username='lila', password='1234') # 拓展以后 from app.models import UserInfo user_obj = UserInfo.objects.create_user(username='lila', password='1234')
Tips
migrations
文件夹下文件(如:0001_initial.py
文件删除),不然会报 ValueError: Related model u'app.model' cannot be resolved
。