Auth模块是什么
Auth模块是Django自带的用户认证模块:
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,
Django它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。
1auth使用
1 在views导入auth模块
from django.contrib import auth
2 配置Mysql数据库,进行数据迁移
makemigration
migrate
3 创建超级用户
manage.py@author > createsuperuser Username (leave blank to use 'administrator'): lifujina Email address: 邮箱不用填 Password: 88888888li Password (again): 88888888li Superuser created successfully.
2 auth模块常用方法
1 认证用户
auth.authenticate(username=name,password=pwd)
在视图层
from django.shortcuts import render,HttpResponse # Create your views here. from django.contrib import auth def login(request,*args,**kwargs): if request.method == "GET": return render(request,"login.html") if request.method == "POST": name = request.POST.get("name") pwd = request.POST.get("pwd") user = auth.authenticate(username=name,password=pwd) 认证密码和用户在数据库中
#username password 不能写成其他 if user: return HttpResponse("登录成功") return HttpResponse("登录失败")
前端
<body>
<form action="/login/" method="post">
<input type="text" name = "name">
<input type="password" name = "pwd">
<input type="submit" value="登录">
</form>
</body>
auth.authenticate (username=name,password=pwd)
认证用户名和密码是否存在
2 用户登录
auth.login(request, user)
user = auth.authenticate(username=name,password=pwd)
if user:
auth.login(request,user=user) 注意是俩个参数,一个是request,一个是登录的用户
#用户登录
#user 是当前认证通过的user
#会在生成一个随机字符串,并存在session中
return HttpResponse("登录成功")
return HttpResponse("登录失败")
3 获得当前登录用户
request.user
def login(request,*args,**kwargs): if request.method == "GET":
return render(request,"login.html") if request.method == "POST":
name = request.POST.get("name")
pwd = request.POST.get("pwd") user = auth.authenticate(username=name,password=pwd)
if user:
auth.login(request,user=user)
#用户登录
#user 是当前认证通过的user
#会在生成一个随机字符串,并存在session中
usr = request.user
#当前登录用户,但是一个要在登录后才能拿到,
如果没有登录显示匿名用户
request.user = AnonymousUser
#当前登录用户,不仅可以在后台能拿到,前台也能拿到
print(usr)
return HttpResponse("登录成功")
return HttpResponse("登录失败")
4 用户退出登录
logout(request)
def logout(request):
auth.logout(request) 一定注意有个request参数
相当于执行了:request.session.flush()
return redirect("/login/")
5 登录认证装饰器(控制用户,没有登录不能访问某个连接)
@login_required(redirect_field_name="eee",login_url="/login/")
导入 login_required模块
from django.contrib.auth.decorators import login_required
局部认证:(直接加在被认证的函数上面)
@login_required(redirect_field_name="eee",login_url="/login/")
redirect_field_name="eee", 修改路径上?后的key值
login_url=”/login/” 在没有登录的情况下,访问test要跳转的页面
def test(request,*args,**kwargs):
return render(request,"test.html")
全局认证:(在settings中配置)
LOGIN_URL = “/login/”只要没有登录的直接访问,跳到login页面
@login_required() 这里的参数就不用再写了
def test(request,*args,**kwargs):
return render(request,"test.html")
6 创建超级用户和普通用户
logout(request)
from django.contrib.auth.models import User 一定要导入
def register(request,*args,**kwargs):
name = 'egon'
pwd = "123" user = User.objects.create_user(username=name,password=pwd)
username password 不能写错
sup_user = User.objects.create_superuser(username=name,password = pwd) return HttpResponse("注册成功")
1 导入from django.contrib.auth.models import User 下的 User
2 创建普通用户 和 超级用户
7 校验密码是否正确(check_password(password)
check_password(password)
auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。
密码正确返回True,否则返回False。
用法:
ok = user.check_password('密码')
def check_password(request,*args,**kwargs):
pwd = "123"#应该是前台将密码传过来 res = request.user.check_password(pwd)
#注意是校验当前登录用户的密码(request.user为当前登录用户)
if res:
return HttpResponse("OK")
return HttpResponse("密码错误")
8 修改密码
set_password(password)
auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。
注意:设置完一定要调用用户对象的save方法!!!
def chang_password(request,*args,**kwargs): pwd = "123"
user = request.user #获得当前登录用户
user.set_password(pwd) #当前登录用户,调用 set_password(pwd) 修改密码的 方 法 pwd 为新密码
user.save() # 一定要记得保存 save() return HttpResponse("OK")
9 判断当前用户有没有登录
is_authenticated()
def user_pass(request,*args,**kwargs):
user = request.user.is_authenticated()
#requset.user为当前登录用户,如果登录了,user值为True
没登录 user 为False
print(user)
return HttpResponse("OK")
10 其他方法
request.user.is_staff() :
用户是否拥有网站的管理权限. (设为false 不能登录admin)
request.user.is_active() :
是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。(设为false,用户还存在,但是不能登录,封号)
2 auth_user 增加自定义字段
1 自定义一个类 继承AbstractUser
from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser):
#继承了 AbstractUser(auth 中的 User 其实就是继承了AbstractUser )拥有父类的所有字段
phone = models.BigIntegerField(max_length=11,null=True) #并派生了 我们自己的 的 字段 sex = models.BooleanField()
#括号内 不能写null=True
#这个字段是布尔类型 0 就代表false 1 代表ture
2 在settings 中配置 AUTH_USER_MODEL
AUTH_USER_MODEL = "appo.UserInfo" #注意 是appo.UserInfo 而不是 appo.models.UserInfo #是字典的形式 这句话 意思 就是 以后的 AUTH_USER 就 用 appo.UserInfo
3 在要使用 UserInfo 的地方 导入 UserInfo
# from django.contrib.auth.models import User
from appo.models import UserInfo
def register(request,*args,**kwargs):
name = 'egon'
pwd = "123"
sex = 0 user = UserInfo.objects.create_user(username=name,password=pwd,sex=sex)
# sup_user = User.objects.create_superuser(username=name,password = pwd) return HttpResponse("注册成功")
注意: 这样数据库中就没有 auth_user这个表了,而是由userinfo取代了,以后凡是要用到User的地方 都用UserInfo 替代, auth 所具有的方法,使用方式一样