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模块常用方法

认证用户

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) 

认证用户名和密码是否存在

 

用户登录

 

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("登录失败")

 

 

用户退出登录

logout(request)

 

def logout(request):
    auth.logout(request)       一定注意有个request参数
相当于执行了:request.session.flush()
    return redirect("/login/")

 

 

登录认证装饰器(控制用户,没有登录不能访问某个连接)

@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")
 

 

创建超级用户和普通用户

 

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

创建普通用户 超级用户

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

校验密码是否正确(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("密码错误")

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

修改密码

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 所具有的方法,使用方式一样

 

上一篇:按enter执行click或者搜索问题


下一篇:yourphp常用标签