django中的auth详解
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)
在视图层
1 from django.shortcuts import render,httpresponse 2 3 4 5 # create your views here. 6 7 from django.contrib import auth 8 9 10 11 def login(request,*args,**kwargs): 12 13 14 15 if request.method == "get": 16 17 return render(request,"login.html") 18 19 20 21 if request.method == "post": 22 23 name = request.post.get("name") 24 25 pwd = request.post.get("pwd") 26 27 28 29 user = auth.authenticate(username=name,password=pwd) 认证密码和用户在数据库中 30 #username password 不能写成其他 31 32 if user: 33 34 return httpresponse("登录成功") 35 36 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 所具有的方法,使用方式一样
下一篇: flash创建对象怎么限定时间?