Django内置的用户认证

简介: 认证登陆在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码。事实上,Django已经提供了内置的用户认证功能。

认证登陆

在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;

如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码。

事实上,Django已经提供了内置的用户认证功能。

在使用"python manage.py makemigrationss""python manage.py migrate"迁移完成数据库之后

根据配置文件settings.py中的数据库段生成的数据表中已经包含了6张进行认证的数据表,分别是

  • auth_user
  • auth_group
  • auth_group_permissions
  • auth_permission
  • auth_user_groups
  • auth_user_user_permissions

进行用户认证的数据表为auth_user

要使用Django自带的认证功能,首先要导入auth模块

from django.contrib import auth         #导入auth模块

django.contrib.auth中提供了很多方法,我们常用的有三个方法:

authenticate()

提供了用户认证,即验证用户名以及密码是否正确,一般需要username和password两个关键字参数

如果通过认证,authenticate()函数会返回一个User对象。

authenticate()函数会在User对象上设置一个属性标识,这个属性标识经过数据库验证用户名及密码。

当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象时会报错。

使用:

    user=authenticate(username="uaername",password="password")
    
    login(HttpResponse,user)

这个函数接受一个HttpRequest对象,以及一个通过authenticate()函数认证的User对象

login(request)登陆用户

这个函数使用Djangosession框架给某个已认证的用户附加上session_id信息。

使用:

    from django.shortcuts import render,redirect,HttpResponse
    
    from django.contrib.auth import authenticate,login
    
    def auth_view(request):
        username=request.POST.GET("usernmae")       # 获取用户名
        password=request.POST.GET("password")       # 获取用户的密码
    
        user=authenticate(username=username,password=password)  # 验证用户名和密码,返回用户对象
    
        if user:                        # 如果用户对象存在
            login(request,user)         # 用户登陆
            return redirect("/index/")
    
        else:
            return HttpResponse("用户名或密码错误")

logout(request)注销用户

这个函数接受一个HttpResponse对象,无返回值。

当调用该函数时,当前请求的session信息全部被清除。

即使当前用户没有登陆,调用该函数也不会报错。

使用:

    from django.shortcuts import render,redirect,HttpResponse
    
    from django.contrib.auth import authenticate,login,logout
    
    def logout_view(request):
        
        logout(request)     # 注销用户
        
        return redirect("/index/")

user对象的is_authenticated()

要求:

  • 用户登陆后才能访问某些页面
  • 如果用户没有登陆就访问本应登陆才能访问的页面时会直接跳转到登陆页面
  • 用户在登陆页面登陆后,又会自动跳转到之前访问的页面

方法一:

    def view1(request):
        
        if not request.user.is_authenticated():
            return redirect("/login/")

方法二:

使用Django的login_requierd()装饰器

使用:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def views(request):
        pass

如果用户没有登陆,则会跳转到Django默认的登陆URL的"/accountss/login/"

login视图函数可以在settings.py文件中通过LOGIN_URL修改默认值

用户登陆成功后,会重定向到原来的路径。

user对象

User对象属性:username,password为必填项

password用哈希算法保存到数据库中
  • is_staff:判断用户是否拥有网站的管理权限
  • is_active:判断是否允许用户登陆,设置为“False”时可以不用删除用户来禁止用户登陆

User对象的方法

is_authenticated()

如果是通过auth函数返回的真实的User对象,返回值则为True。这个方法检查用户是否已经通过了认证。

is_authenticated()函数的返回值为True时,表明用户成功的通过了认证。

创建用户

使用create_user辅助函数创建用户

from django.contrib.auth.models import User
user=User.objects.create_user(username="username",password="password")

set_password(password)

使用这个方法来修改密码

使用:

    from django.contrib.auth.models import User
    
    user=User.objects.get(username="username")      # 获取用户对象
    user.set_password(password="password")          # 设置对象的密码
    
    user.save()

check_password(password)

用户想修改密码的时候,首先要让用户输入原来的密码。

如果用户输入的旧密码通过密码验证,返回True。

例子一,使用set_password()方法来修改密码

    from django.shortcuts import render,redirect,HttpResponse
    from django.contrib.auth.models import User
    
    def create_user(request):
    
        msg=None
    
        if request.method=="POST":
            username=request.POST.get("username"," ")           # 获取用户名,默认为空字符串
            password=request.POST.get("password"," ")           # 获取密码,默认为空字符串
            confirm=request.POST.get("confirm_password"," ")    # 获取确认密码,默认为空字符串
    
            if password == "" or confirm=="" or username=="":   # 如果用户名,密码或确认密码为空
                msg="用户名或密码不能为空"
            elif password !=confirm:                            # 如果密码与确认密码不一致
                msg="两次输入的密码不一致"
            elif User.objects.filter(username=username):        # 如果数据库中已经存在这个用户名
                msg="该用户名已存在"
            else:
                new_user=User.objects.create_user(username=username,password=password)  #创建新用户 
                new_user.save()
            
                return redirect("/index/")
        
        return render(request,"login.html",{"msg":msg})

例子二,使用login_required装饰器来修改密码

    from django.shortcuts import render,redirect,HttpResponse
    from django.contrib.auth import authenticate,login,logout
    from django.contrib.auth.decorators import login_required
    from django.contrib.auth.models import User
    
    @login_required
    def change_passwd(request):
        user=request.user       # 获取用户名
        msg=None
    
        if request.method=='POST':
            old_password=request.POST.get("old_password","")    # 获取原来的密码,默认为空字符串
            new_password=request.POST.get("new_password","")    # 获取新密码,默认为空字符串
            confirm=request.POST.get("confirm_password","")     # 获取确认密码,默认为空字符串
    
            if user.check_password(old_password):               # 到数据库中验证旧密码通过
                if new_password or confirm:                     # 新密码或确认密码为空
                    msg="新密码不能为空"   
                elif new_password != confirm:                   # 新密码与确认密码不一样
                    msg="两次密码不一致"
    
                else:
                    user.set_password(new_password)             # 修改密码
                    user.save()
    
                    return redirect("/index/")
            else:
                msg="旧密码输入错误"
    
        return render(request,"change_passwd.html",{"msg":msg})
目录
相关文章
|
数据安全/隐私保护 Python
Django用户认证系统
.权限管理 Django利用auth_permission表定义权限 Permission表的定义非常简单,只有三个属性: name:权限显示的名称,最多允许255个字符 content_type:关联ContentType(记录App与model的信息) codename:权限的名称编码,最多允许100个字
88 0
Django用户认证系统
|
数据安全/隐私保护 Python 数据库
Django之路——11 Django用户认证组件 auth
用户认证  auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 、authenticate()    提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数 如果认证信息有效,会返回一个  User  对象。
1695 0
|
Web App开发 存储 缓存
第20天,Cookie与Session、Django的用户认证、事务
目录 一、Cookie与Session 1.1 概念 1.2 Django实现的cookie 1.2.1 获取Cookie 1.
2268 0
|
数据安全/隐私保护 Python API
django 1.8 官方文档翻译: 13-1-1 Django 中的用户认证
Django 中的用户认证 Django从开始就带有一个用户认证系统。它处理用户账号、组、权限以及基于cookie的用户会话。
|
1月前
|
监控 安全 应用服务中间件
python中Django入门(四)
python中Django入门(四)
29 0
|
10天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
2月前
|
前端开发 关系型数据库 MySQL
基于python+django+vue.js开发的社区养老管理系统
基于python+django+vue.js开发的社区养老管理系统
92 1
|
2天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
17天前
|
前端开发 测试技术 数据库
【python】为什么使用python Django开发网站这么火?
【python】为什么使用python Django开发网站这么火?
|
1月前
|
中间件 数据安全/隐私保护 Python
python中Django入门(三)
python中Django入门(三)
17 0