django用户认证之auth模块

时间:2019-11-26
本文章向大家介绍django用户认证之auth模块,主要包括django用户认证之auth模块使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Auth认证模块

执行数据库迁移的那两条命令时,即使我们没有建表,django是不是也会创建好多张表?我们创建之后去看一下里面的一个叫auth_user表,既然是表,那肯定应该有对应的操作改表的方法

auth_user表记录的添加

创建超级用户(不可手动插入,因为密码是加密的)

简单使用auth认证

from django.contrib import auth

def login(request):

  if request.method == 'POST':

    name = request.POST.get('name')

    pwd = request.POST.get('pwd')

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

    # 类似于user=models.User.objects.filter(username=name,password=pwd).first()

    if user:

      return redirect('/home/')

  return render(request,'login.html')

只是简单的验证信息不行,还需要给当前成功登陆的用户保存登陆状态,之前是通过cookie或者session,现在呢,auth也给你提供了一个比较好用的方法

if user:

  # 等价于request.session['name']=name

  auth.login(request,user)  # 登陆,其实就把用户信息放到session中,跑一下验证session表

上面的验证和登陆其实不是它的亮点,亮点在于

# 只要登陆成功执行了auth.login(request,user)

# 之后在其他任意的视图函数中都通过request.user获取当前登陆用户对象

​

# 当没有执行auth.login,request.user打印出来的是匿名用户。将session表数据删除即可演示改效果

# 如何判断request.user用户是否通过auth.login登陆呢?request.user.is_auth

​

# 为何执行auth.login之后,其他视图函数中就可以通过request.user拿到当前登陆对象呢?因为django的中间件中有一个叫Auth啥的中间件,它取出session去表里面查相应的数据,然后放到request.user中

注销

auth.logout(request)

# 等价于删除session数据request.session.flush()

装饰器校验是否登陆及跳转

from django.contrib.auth.decorators import login_required

​

@login_required(login_url='/login/',redirect_field_name='old')  # 没登陆会跳转到login页面,并且后面会拼接上你上一次想访问的页面路径/login/?next=/test/,可以通过参数修改next键名

def my_view(request):

  pass

如果我所有的视图函数都需要装饰并跳转到login页面,那么我需要写好多份

# 可以在配置文件中指定auth校验登陆不合法统一跳转到某个路径

LOGIN_URL = '/login/'  # 既可以局部配置,也可以全局配置

回到最上面,我们是怎么对auth_user表添加数据的?命令行输入~~~合理不?

from django.contrib.auth.models import User

def register(request):

  User.objects.create()  # 不能用这个,因为密码是明文

  User.objects.createuser()  # 创建普通用户

  User.objects.createsuperuser()  # 创建超级用户

校验密码,修改密码

request.user.check_password(pwd)  # 为什么不直接获取查,因为前端用户输入的是明文数据库密文

​

request.user.set_password(pwd)

request.user.save()  # 修改密码

自定义模型表应用auth功能

如何扩张auth_user表?

一对一关联(不推荐)

from django.contrib.auth.model import User

​

class UserDetail(models.Models):

  phone = models.CharField(max_length=11)

  user = models.OnoToOneField(to=User)

面向对象的继承

from django.contrib.auth.models import User,AbstractUser

class UserInfo(AbstractUser):

  phone = models.CharField(max_length=32)

​
# 需要在配置文件中,指定我不再使用默认的auth_user表而是使用我自己创建的Userinfo表
AUTH_USER_MODEL = "app名.models里面对应的模型表名"
"""
自定义认证系统默认使用的数据表之后,我们就可以像使用默认的auth_user表那样使用我们的UserInfo表了。
库里面也没有auth_user表了,原来auth表的操作方法,现在全部用自定义的表均可实现


原文地址:https://www.cnblogs.com/zhaogang0104/p/11933927.html