博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

Auth认证模块

一:什么是Auth模块

  就是django默认的用户认证系统:现包括用户注册、用户登录、用户认证、注销、修改密码等功能

二:如何使用auth模块

  首先导入模块:

# 导入auth模块
from django.contrib import auth
# 导入django的auth_user表
from django.contrib.auth.models import User

  使用auth模块实现用户的注册:

def auth_register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # auth.authenticate:重auth_user中拿去数据生成一个user对象
        user_obj = auth.authenticate(request,username=username)
        # 如果对象已经存在就终止注册
        if user_obj:
            return HttpResponse('当前用户已存在')
        # 此过程是创建普通用户
        # User.objects.create_user(username=username,password=password)
        # 此过程是创建超级用户
        User.objects.create_superuser(username=username,password=password,email='123@163.com')
    return render(request,'auth_register.html')

  ps:超级用户和普通用户的区别:

      1:超级用户可以登陆django自带的后台管理系统,而普通用户不可以

      2:超级用户在创建时必须指定email,而普通用户可以不指定。

      3:超级用户在用户表中的is_superuser的字段是储存的是1,而普通用存储的是0。

 

  使用auth模块实现用户的登陆:

# 导入auth模块
from django.contrib import auth
# 导入django的auth_user表
from django.contrib.auth.models import User
def auth_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # models.User.objects.filter(username=username,password=password).first()
        user_obj = auth.authenticate(request,username=username,password=password)
        if user_obj:
            # 记录用户状态
            request.session['name'] = username
            auth.login(request,user_obj)  # 一旦记录了,可以在任意的地方通过request.user获取到当前登录对象
            return HttpResponse('ok')
    return render(request,'auth_login.html')

  ps:登陆的特点在于:

    1:只要成功实行了auth.login(request,user_obj)之后,就会从其他任意视图函数中通过request.user_obj获取登陆用户对象。

    2:当没有执行auth.login,request.user打印出来的是匿名用户。

    3:request.user.is_auth可以判断request.user是否通过auth_login登陆。

 

  注销:

def auth_logout(request):
    auth.logout(request)  # request.session.flush()
    return HttpResponse('ok')

 

  修改密码:

def auth_password(request):
    print(request.user.password)
    is_res = request.user.check_password('jason123')  # 校验密码是否一致
    if is_res:
        request.user.set_password('666')  # 设置新密码
        request.user.save()  # 修改密码必须save保存  不然无效
    return HttpResponse('ok')

 

  使用装饰器校验登陆以及是否跳转:

from django.contrib.auth.decorators import login_required
@login_required(login_url='/auth_login/') # 局部配置,校验失败则跳转到指定页面
def auth_home(request):
    return HttpResponse('home必须登录才能访问')


@login_required(login_url='/auth_login/')
def auth_xxx(request):
    return HttpResponse('xxx必须登录才能访问')

  在setting中配置自动跳转:

LOGIN_URL = '/auth_login/'

三:如何扩张auth_user表:

  采用面向对象继承的方法:

from django.contrib.auth.models import User,AbstractUser
class UserInfo(AbstractUser):
  phone = models.CharField(max_length=32)

  需要在配置文件中,指定我们不再使用的auth_user表而是使用我自己创建的userinfo表:

  settings.py

# 告诉django不再使用默认的auth_user,而使用我们自己定义的表
# AUTH_USER_MODEL = "app名.models里面对应的模型表名"
AUTH_USER_MODEL = 'app01.Userinfo'

 

  

 

posted @ 2019-06-19 14:49  monsterc4t  阅读(278)  评论(0编辑  收藏  举报

消失在风中的少年 -mashiro