• Django中的auth用法


    Auth模块:用户认证

     

    我们没用auth模块前的验证方法:authenticate

    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()    
            # 我们通过django的orm查询表里有没有对应的数据,有的话登录成功
        return render(request,'auth_login.html')

    用auth模块:

    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)
            # 相当于执行了上面的那句,得到一个用户对象,获取到的明文密码会自动转为密文去数据库比较
            
        return render(request,'auth_login.html')

    登录成功后记录用户的登录状态:auth.login

    # 记录用户状态
        request.session['name'] = username
        
    # auth模块记录
        auth.login(request,user_obj)
    
    # request.session保存的只是字符串,而auth保存的则是对象,一但记录了,可以在任意地方通过request.user获取到当前登录对象, 
    未登录状态取request.user 后台会返回 AnonymousUse(匿名用户)

    判断当前用户是否登录:is_authenticated

    request.user.is_authenticated()
    # 登录返回Ture

    退出登录:logout

    auth.logout(request)
    # 相当于
        request.session.flush()

    用auth模块完成注册功能时记住,用就全都用auth

    保存注册用户时:create_user

    models.User.object.create(username=username,password=password)
    User.objects.create(username=username,password=password)
    # 这里保存用户不能在用create,否则密码会以明文的形式保存
    
    User.objects.create_user(username=username,password=password)
    # 创建普通用户
    User.objects.create_superuser(username=username,password=password,email='123@qq.com')
    # 创建超级用户,登录后台管理系统,需要邮箱。

    修改密码:check_password、setpassword

    def auth_password(request):
        print(request.user.password) # 打印出来的password是密文形式
    
        old_password = request.POST.get('old_password') # 获取用户输入的旧密码
        new_password = request.POST.get('new_password') # 获取用户输入的新密码
    
        is_res = request.user.check_password(old_password) # 去数据库比对是否正确
        if is_res:
            request.user.setpassword(new_password) # 设置新密码
            request.user.save() # 保存密码,这一步不能少,否则密码不会被修改

    登录验证:login_required

    from django.contrib.auth.decorators import login_required
    @login_required(login_url='/login/')  # 局部配置
    def home(request):
        return HttpResponse('ok')
    # 全局配置需要在settings中配置参数
    LOGIN_URL = '/login/'
    
    from django.contrib.auth.decorators import login_required
    @login_required    # 装饰器后面不需要指定跳转页面,直接跳到全局配置的页面
    def home(request):
        return HttpResponse('ok')

    扩展默认的auth_user表

    想要加一个存储用户手机号的字段

    我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。

    from django.contrib.auth.models import AbstractUser
    class UserInfo(AbstractUser):#继承AbstractUser
        """
        用户信息表
        """
        nid = models.AutoField(primary_key=True)#这样就相当于在自己的类中可以派生出新的字段
        phone = models.CharField(max_length=11, null=True, unique=True)#
        
        def __str__(self):
            return self.username#字符串原样输出

    注意:

    按上面的方式扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。写法如下:

    # 引用Django自带的User表,继承使用时需要设置,不加数据库迁移不了
    AUTH_USER_MODEL = "app名.UserInfo"

    再次强调:

    一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。

  • 相关阅读:
    [转] C# DataTable 导出 Excel 进阶 多行表头、合并单元格、中文文件名乱码
    【转】sql语句精选二
    【转】sqlserver游标概念与实例全面解说
    按多个关键字查询(sql)
    Asp.net使用repeater控件动态添加、删除一行
    SQL SERVER 导入、导出数据到Exce(使用OpenRowset,、OpenDataSource函数)以及访问远程数据库(openrowset/opendatasource/openquery)
    对 Dflying Chen 提到的Edit GridView Using CheckBoxes 进行一个小改造
    软件开发专业技术名词的解释
    (总结)如何为windows服务添加安装程序
    软件开发过程(RUP概述) 转
  • 原文地址:https://www.cnblogs.com/python-Arvin/p/11896927.html
Copyright © 2020-2023  润新知