用户认证组件
组件功能,用session记录登陆验证状态,模块都封装在auth模块里
导包: from django.contrib import auth
这个组件也能让会话跟踪更严谨,
A用户登录后再用同一个客户端登录B用户,session在数据库的记录会被新建且覆盖之前的session,从始至终只有1条数据库记录 而A用户登完,再用A用户账号密码登陆,原始的session在数据库的记录不会发生变化.
前提: 数据库为auth-user表,创建超级用户 python manage.py createsuperuser
API
1.1 authenticate(username=,password=),进行用户名和密码认证
当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的
如果验证成功,返回user对象,失败返回None
1.2 login(request,user) login模块就是把用户的状态保存到session中去的
参数2是前一个authenticate认证成功返回的user对象,这个对象会赋值给request.user
也就是request.user =user, 这里request.user如果认证成功则是登陆的用户对象,如果未认证,则是一个匿名用户对象,匿名用户只有username字段可以输出调用
匿名用户还有下面其他几个属性可以用
id 永远为None
username 永远为空字符串
get_username() 永远返回空字符串
is_staff和is_superuser 永远为false
is_active 永远为false
groups 和user_permission 永远为空
is_annoymous() 返回True
is_authenticated 返回False
set_password(),check_password(),save()和delete()会引发NotImplementError
1.3 logout()
auth.logout(request)
这一句等于执行了request.session.flush()
该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
User对象
导包 from django.contrib.auth.models import User
User对应的就是数据库的auth_user表
2.1 user对象的 is_authenticated
方法1:
def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
方法2:
django已经为我们设计好了一个用于此种情况的装饰器:login_requierd()
在setting.py要设置login_url,设置登陆页面,一旦装饰器认证失败返回这个登陆页面
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
2.2 创建用户
使用 create_user 辅助函数创建用户:
from django.contrib.auth.models import User
user ``=` `User.objects.create_user(username="",password="",email="")
自己直接调用User.objects.create,也可以只不过这样存储的账号密码是明文,而django自带的创建的是密文
2.3 check_password(passwd)
用户修改密码的时候,让他先输入原来的密码,如果输入正确返回true
2.4修改密码
使用set_password()来修改密码
user =User.objects.get(username="")
user.set_password(password="")
user.save