django组件之用户认证组件
auth模块
导入语法: from
django.contrib
import
auth
django.contrib.auth中提供了许多方法,这里主要介绍其中的三个:(这些都是基于使用auth_user这张表的前提的)
auth.authenticate()
提供用户认证的功能,当认证成功之后会返回一个对象,没有返回None(一般需要俩两个参数,username.password------和auth_user表的字段对齐)
user_obj=auth.authenticate(username='xx',password='ww')
authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。
当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!
login(request, user)
该函数接受一个HttpRequest对象,以及一个已经认证了的User对象
此函数使用django的session框架给某个已认证的用户附加上session id等信息。
def login(request):
if request.method=='GET':
return render(request,'login.html')
else:
user=request.POST.get('user')
pwd=request.POST.get('pwd') #有这个对象,返回对象,没有值返回None
user_obj=auth.authenticate(username=user,password=pwd)
if user_obj:
# request.session['is_login']=True #session的写法
# request.session['user']=user #创建一把钥匙
auth.login(request,user_obj) #注入session信息 request.session['user_id']=user_obj.pk
print(request.user) #request.user=user_obj
return redirect('/index/')
else:
return redirect('/login/')
auth.logout(request)
注销在服务器上的登录记录:
def logout(request):
auth.logout(request)
return render(request,'login.html') #注销后跳转到登录页
该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
user对象
1. 之前函数执行login(),登录成功,request.user代表登录对象
具有多个属性:1. request.user.username
2. request.user.id
3. request.user.email 等等
2. 没有登录过,AnonymousUser默认匿名用户对象
只有一个属性:1. reques.user.id
3.我们要明确的是:
1.request.user并不是请求体中的,而是中间件.middleware.AuthenticationMiddleware在认证成功之后帮我们注入的.(中间件执行优先)
2.每一次请求,都要先经过中间件,中间件会先检查你的钥匙,如果数据库有你的钥匙就把钥匙指向的对象取出来,赋值给request.user_id,
如果没有钥匙的,服务端也会给request.user赋一个值,request.user_id,匿名用户!
3. request.user是一个全局变量,无论在哪一个视图函数中都能使用,包括页面(template)
user对象api之request.user.is_authenticate
判断是否登录:
1.request.user.id
2.request.user.is_authenticate
#两者区别不大
user对象api之@login_required
其实是一个双层装饰器函数,最主要是其可以跳转到登录前的页面
user对象api之创建用户
auth_user表:
from django.contrib.auth.models import User
User.objects.create(username="alex",password="123") #注意,这是明文的存储
User.objects.create_user(username="alex",password="123") #普通用户,密文
User.objects.create_superuser(username="alex",password="123") #超级用户,密文 ,必须有email字段,可以为空