django的auth模块

  • 一、auth模块是什么?
  • 二、auth模块常用方法
  • 三、User对象的属性
  • 四、扩展默认的auth_user表
    • 方式一:通过关联
    • 方式二:通过继承
  • 五、自定义中间表(中介模型)

一、auth模块是什么?

# auth是django自带的用户认证模块:
开发网站的时候可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能。
Django内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。

二、auth模块常用方法

from django.contrib import auth
  • authenticate()
authenticate()方法提供了用户认证功能,即验证用户名及密码是否正确,一般需要username、password两个关键字参数(参数名不能随意填,要与数据库中auth表字段名一样)
- 如果验证成功会返回一个user对象
- authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
# 用法:
from django.contrib import auth
from django.contrib.auth import authenticate, logindef login(request):username = request.POST['username']password = request.POST['password']user = auth.authenticate(request, username=username, password=password)if user:return redirect('/index/')else:return HttpResponse('username or password error')
  • login(HttpRequest, user)
- 此函数接受的是一个HTTPRequest对象,以及一个经过认证的User对象
- 此函数实现一个用户登录的功能,本质上会在后端为该用户生成相关session数据
- 调用了login后,以后所有的视图函数都可以使用request.user,它就是当前登录用户

​ 用法示例:

from django.contrib import auth
from django.contrib.auth import authenticate, logindef login(request):username = request.POST['username']password = request.POST['password']user = auth.authenticate(request, username=username, password=password)if user:auth.login(request, user)return redirect('/index/')else:return HttpResponse('username or password error')
  • logout(request)
- 还函数接受一个HttpRequest对象,没有返回值
- 调用该函数时,当前请求的session信息会被全部清除,该用户即使没有登录,使用该函数也不会报错

​ 用法示例:

from django.contrib.auth import logout
from django.contrib import auth
def logout_view(request):auth.logout(request)return redirect('/login_view/')
  • is_authenticated()
# 用来判断当前请求是否通过了认证,返回布尔值
# 多用于前端判断,在后端做判断时,可以被 if user 替代# 示例:
def myview(request):if not request.user.is_authenticated():return redirect(f'{settings.LOGIN_URL}?next={request.path}')
  • login_required()
# auth给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。
# 如果用户没有登录,则会自动跳到django默认的登录URL'/accounts/login/',并传递当前访问url的绝对路径(登录成功后,会重定向到该路径)
# 如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改
# 示例:
LOGIN_URL = '/login/'# 装饰器用法示例:
from django.contrib.auth.decorators import login_required@login_required
def my_view(request):pass
  • create_user() 和 create_superuser()
auth提供的一个创建新用户/超级用户 的方法,需要提供必要的参数(username、password)等
# 示例:from django.contrib.auth.models import user# 创建普通用户
user1 = User.objects.create_user(username='#用户名1',password='#密码1',email='#邮箱地址1'...)
# 创建超级用户
user2 = User.objects.create_super_user(username='#用户名2',password='#密码2',email='#邮箱2'...)
  • check_password(password)
# auth提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码
# auth数据库中存储的是密文密码,用前端输入的密码和数据库中的密文密码直接和前端输入的密码匹配是不能成功的
# 密码正确返回True,否则返回False
# 用法示例:flag = user.check_password('#密码')
  • set_password(password)
auth提供的一个修改密码的方法,接受要设置的新密码作为参数
# 注意:设置完一定要调用用户对象的save()方法,同样的,设置好的额密码是通过该函数在数据库上存成密文的

​ 用法示例:

def change_password(request):if request.method == 'GET':return render(request, 'change_pwd.html')else:old_pwd = request.POST.get('old_pwd')new_pwd = request.POST.get('new_pwd')re_new_pwd = request.POST.get('re_new_pwd')if new_pwd == old_pwd:if request.user.check_password(old_pwd):# 密码正确再修改request.user.set_password(new_pwd)# 记住一定要保存(****)request.user.save()return redirect('/login/')else:return HttpResponse('旧密码不正确')else:return HttpResponse('两次密码输入不一致')

三、User对象的属性

- User对象属性:username,password
- is_staff : 用户是否拥有网站的管理权限,(即能不能登录到后台管理)
- is_superuser : 是否是超级管理员(权限更高,如果is_staff=1,可以任意增删改查任何数据)
- is_active : 是否允许用户登录,设置成False,可以在不删除用户的前提下禁止用户登录

四、扩展默认的auth_user表

内置的auth_user表字段是固定的,项目中往往需要给它添加字段,但是直接改是不行的,拓展该表有如下两个方式:

方式一:通过关联

建立一张表,通过一对一和内置的auth_user表相关联:

from django.contrib.auth.models import Userclass UserDetail(models.Model):phone = models.CharField(max_length=32)addr = models.CharField(max_length=32)user = models.OneToOneField(to=User)

方式二:通过继承

继承内置的AbstractUser,定义一个Model类
这样就可以根据项目的需求灵活设计用户表,又能使用django强大的认证系统

PS:1. 这种方式一开始就要把类建出来,不能中途再试图新增字段,

​ 2. 数据库中的表名就不是 “auth_user” 了,而是变成了 “app01_user”

代码示例:

from django.contrib.auth.models import AbstractUserclass User(AbstractUser):phone = models.CharField(max_length=32)addr = models.CharField(max_length=32)### 在settings.py中注册: app名.表名
AUTH_USER_MODEL = "app01.User"
  • 如果项目一开始没有扩展auth_user表,后期有了加字段的需求:
# 操作步骤:
1、备份-->删库-->重新创建数据库
2、所有的app的数据迁移记录删除migrations记录,(除了__init__.py全部都删除)
3、去源码中删除auth和admin这两个app的migrations下除了__init__.py的记录文件
4、数据迁移,同步到数据库中
5、备份的数据,恢复回去

五、自定义中间表(中介模型)

###1、创建多对多关联关系的三种方式

  • 方式一:自行创建第三张表
class Book(models.Model):name = models.CharField(max_length=32)price = models.DecimalField(max_digits=5,decimal_places=5)class Author(models.Model):name = models.CharField(max_length=32)# 自己创建第三张表,分别通过外键关联书和作者
class AuthorToBook(models.Model):author = models.ForeignKey(to="Author", on_delete=models.CASCADE)book = models.ForeignKey(to="Book", on_delete=models.CASCADE)

方式一这种建法就没法用 book.authors.add(1,2) 这种关联方法了,因为book表中没有authors字段,只能手动写:

book = models.Book.objects.get(pk=1)
models.AuthorToBook.create(book_id=1,author_id=1)
models.AuthorToBook.create(book_id=1,author_id=2)book1 = models.Book.objects.filter(name='西游记').first()
res = models.AuthorToBook.objects.filter(book=book1)
print(res)
  • 方式二:通过ManyToManyField自动创建第三张表
class Book(models.Model):name = models.CharField(max_length=32)# 通过ORM自带的ManyToManyField自动创建第三张表
class Author(models.Model):name = models.CharField(max_length=32, verbose_name="作者姓名")books = models.ManyToManyField(to="Book")
  • 方式三:使用中介模型
class Book(models.Model):nid = models.AutoField(primary_key=True)name = models.CharField(max_length=32)authors = models.ManyToManyField(to="Author", through="AuthorToBook", through_fields=("book", "author"))# through_fields接受一个元组('field1','field2'):# 其中field1是定义当前表对应的外键的名(book),field2是关联目标模型(author)的外键名。# 自己创建第三张表,并通过ManyToManyField指定关联
class Author(models.Model):nid = models.AutoField(primary_key=True)name = models.CharField(max_length=32)class AuthorToBook(models.Model):author = models.ForeignKey(to="Author", to_field='nid', on_delete=models.CASCADE)book = models.ForeignKey(to="Book", to_field='nid', on_delete=models.CASCADE)

当我们需要在第三张关系表中存储额外的字段时,就要使用中介模型的方式了,

但是,用这种方式创建的多对多的关联关系,无法使用set、remove、clear、add方法来管理来管理多对多的关系了,因为第三张表中不一定就只有author和book两个字段

需要通过第三张表的model来管理多对多关系(可以使用book.authors):

book = models.Book.objects.get(pk=1)
print(book.authors.all())

17. auth模块相关推荐

  1. hikaridatasource 加密后登陆不上_python测试开发django42.auth模块登陆认证

    前言 在开发一个网站时,经常会用到用户的注册和登陆相关的账号管理功能,auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. 像用户注册.用户登录.用户认证.注销 ...

  2. Django框架之Auth模块

    一.什么是Auth认证模块 auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之 ...

  3. Django中的auth模块

    1,创建超级用户 在命令行输入:python manage.py createsuperuser 2,认证校验用户名和密码(authenticate方法) 先得导入auth模块:from django ...

  4. Django (auth模块、User对象、用户认证、线上-用户认证)

    一.auth模块 django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: authenticate()    提供了用户认证,即验证用户名以及密码是否正确,一般需要usern ...

  5. Auth模块、Forms组件

    Auth模块 auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这 ...

  6. Web框架之Django_10 重要组件(Auth模块)

    阅读目录 一.auth模块介绍 二.auth模块常用方法 create_superuser() create_user() authenticate() login(HttpRequest, user ...

  7. django的权限认证:登录和退出。auth模块和@login_required装饰器

    在settings.py中配置LOGIN_URL参数: # 用户访问带有(@login_required)标签的页面(view)时,如果没有登录,就会跳转到LOGIN_URL(即登陆url). LOG ...

  8. Django的自带认证系统——auth模块

    Django自带的用户认证 auth模块 from django.contrib import auth 备注:使用auth模块时,我们默认使用Django提供的auth_user表,创建数据时,可以 ...

  9. django18:auth模块

    Auth模块 执行数据库迁移命令后,自动生产多个表. django_session auth_user 直接访问admin路由,需要输入用户名和密码,就是参考auth_user表 管理员用户才能进入 ...

最新文章

  1. 使用FFmpeg进行视频抽取音频,之后进行语音识别转为文字
  2. 关于vs编码格式UTF8中文处理方式
  3. caffe源码分析:blob.hpp分析
  4. oracle怎么从大字段中取节点,Oracle数据库 获取CLOB字段存储的xml格式字符串指定节点的值...
  5. java系列3:数组初始化(基本格式)
  6. Computer science 概念汇总
  7. 研究生小菜简谈“如何做研究”
  8. Python爬取——国家统计局省份加城市 并写入数据库
  9. Ubuntu下启动图形界面startx报错connection to X server lost
  10. ipad iphone开发_如何从iPhone或iPad连接到Windows远程桌面
  11. Smartbi数据报表系统,国内性价比最高的报表工具
  12. 【学习笔记】爬虫框架Scrapy入门
  13. 与ChatGPT合作解析《三体》数学
  14. java程序员面试自我介绍
  15. Taro小程序组件传值
  16. 亚丁号云控之云控设备
  17. RS485的EMC防雷保护方案
  18. SSH注解 关于hibernate一对一双向外键级联关系 查询两表的内容 例子
  19. 三级分销系统是什么模式,三级分销模式合法吗?三级分销合法吗
  20. 预测性分析及常用预测方法

热门文章

  1. Error:java.lang.RuntimeException: Crunching Cruncher XXX.9.png failed, see logs
  2. 关于图像快速缩放算法,目前看到的最好的最清晰的一篇文章
  3. 对象和字符串之间的相互转换
  4. 谷歌从IBM购买千项专利 巩固Android专利防线
  5. 基于抠图的人像特效算法
  6. Android 添加重启菜单,修改关机菜单加入重启、重启至Recovery和重启至Bootloader
  7. stack and unstack
  8. 数据分析初学入门——22本SQL学习书籍推荐
  9. Limo机器人教程-底盘运动学分析4
  10. 【JZOJ3319】【LOJ2686】雪地踪迹【BFS】