Django组件 用户认证,form

auth模块

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

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

事实上,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


django.contrib.auth中提供了许多方法,这里主要介绍其中的三个:

一、(1)authenticate()

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

如果认证信息有效,会返回一个  User  对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!

  user = authenticate(username='someone',password='somepassword') 

使用Pycharm新建项目authDemo

执行2个命令,生成django需要的表

python manage.py makemigrations
python manage.py migrate

我们只需要用到auth_user表,就可以了!

打开auth_user表,默认是空的。其中2个字段,username和password是必须要有的!

注意:添加用户,不能直接插入记录,必须使用命令行

 创建超级用户

  python manage.py createsuperuser 

查看auth_user表,发现多了一条记录

注意:密码是加密的,不能直接查表验证。必须使用authenticate() 进行验证!

from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
# Create your views here.
def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        #用户验证成功,返回user对象,否则返回None
        ret = auth.authenticate(username=user,password=pwd)
        print(ret)
        print(ret.__dict__)
        if ret:
            return redirect("/index/")

    return render(request,"login.html")

def index(request):
    return render(request, "index.html")
视图函数

(2)login(HttpRequest, user)

该函数接受一个HttpRequest对象,以及一个认证了的User对象

此函数使用django的session框架给某个已认证的用户附加上session id等信息。

from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
# Create your views here.
def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        #用户验证成功,返回user对象,否则返回None
        user = auth.authenticate(username=user,password=pwd)
        # print(user)
        # print(user.__dict__)
        if user:
            #登录,注册session
            # 全局变量 request.user=当前登陆对象(session中)
            auth.login(request,user)
            return redirect("/index/")

    return render(request,"login.html")
视图函数

request.user 默认是一个匿名对象,auth_user表的所有字段对应的值,都是空的。

当登录成功之后,该对象才会有值。

request.user是全局变量,可以在任意代码中运用

它用了一个中间件,在settings.py中的MIDDLEWARE配置项里

'django.contrib.auth.middleware.AuthenticationMiddleware',

(3)logout(request) 注销用户

 首页添加注销功能

该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

def logout(request):  # 注销
    auth.logout(request)  # 清除session和cookie
    return redirect("/login/")
View Code

它其实和session清理类似,也是执行了命令

request.session.flush()

但是在清理之前,它做了一些条件判断!

注销之后,request.user就是匿名用户了!

注意:user是下面这行代码。变量的名字而已(等式左边的名字)

user = auth.authenticate(username=user,password=pwd)

request.user不是固定写法,根据变量名而变化!

二、User对象

User对象的属性 

User对象属性:username, password(必填项)password用哈希算法保存到数据库 

is_staff : 用户是否拥有网站的管理权限.

is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。

(1)user对象的 is_authenticated()

 如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name

def index(request):
    print(request.user)  # 默认是一个匿名对象
    print(request.user.id)
    print(request.user.username)
    if not request.user.is_authenticated:
        return redirect("/login/")
    name = request.user.username
    return render(request, "index.html",{"name":name})
index 函数

注意:is_authenticated后面是没有括号的,它返回一个布尔值!

(2) 创建用户

 auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。

from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
原文地址:https://www.cnblogs.com/Mr-Murray/p/9478588.html