热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

17.auth模块

django的auth模块

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, login

def 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, login

def 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 User
class 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 AbstractUser
class 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())

推荐阅读
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • python限制递归次数(python最大公约数递归)
    本文目录一览:1、python为什么要进行递归限制 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
author-avatar
呢嘚吖頭ing_311
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有