#前言:
本文主要介绍了关于Django中Auth模块的实现,如若各位大佬发现错误或者需要添加的内容,欢迎各位指正,最后我后续还会继续更新关于Django的一些基本内容,欢迎大家关注。
一、简介:
“Auth”模块是指“authentication(身份验证)”模块,用于验证用户身份和控制用户访问权限。在软件开发中,身份验证是确保用户是其所声称的身份的过程,以及在确认其身份后控制其可以访问的资源和操作。
首先我们要清楚,Auth 用户认证 , 本质上是设置 Session。
Django 认证系统同时处理认证和授权:
认证:验证一个用户是否为 Django 声明,如果是可以进行登录或者访问
授权:决定一个已经验证的用户有哪些功能是允许操作。
在 Django 迁移数据库的是时候会自动生成一张用户认证表:auth_user , 存放用户的基本信息(用户名 , 密码 , 邮箱……)证的用户有哪些功能是允许操作。
二、扩建auth_user 表:
在 Django 迁移数据库的是时候会自动生成一张用户认证表:auth_user , 存放用户的基本信息(用户名 , 密码 , 邮箱……)证的用户有哪些功能是允许操作。扩建auth_user 表,实际上就是扩建 auth_user 表中的字段数据。
方式一:
创建一对一,绑定 auth_user 表(不推荐)。
方式二:继承AbstractUser
在定义模型类的时候继承 AbstractUser 类,进行数据迁移的时候不会生成 auth_user , 原有的 auth_user 中的所有字典就会继承到自定义的模型类中。
实现字段的扩建,直接在自定义模型类中添加额外的新字段即可。
python">from django.contrib.auth.models import AbstractUserclass User(AbstractUser):# 添加额外的字段mobile = models.CharField(max_length=11)class Meta:db_table = 'UserInfo'
扩建 auth_user 表的前提:
1、在实现扩建的时候 ,不允许,不能先执行迁移数据库(如果已经迁移过数据库,就换一个新的数据库)。
2、在扩建中,只能添加字段 , 不能修改或者删除原有字段。
三、重新配置 auth 认证模型类:
在setting.py文件中:
python"># 配置自定义的认证模型类
# AUTH_USER_MODEL = '应用名称.模型类'
AUTH_USER_MODEL = 'AuthApp.User'
四、操作实现:
关于Auth的操作,我们主要是为了实现当我们用户未曾登录访问网站时,进去主页后有一些操作页面必须是在登录状态才可以实现的。所以若是未登录,要点击这些操作则重定向到指定页面(比如登录页面),若是登录则正常访问。
1、前期准备:
在实现操作前我们先创建几个前端页面(这里就不展示了),分别为register.html 注册页面,login.html 登录页面,index.html 主页面。
2、设置注册视图类:
注意:在我们正常将数据传输给数据库时,我们的数据都是可以看到的,而我们这里用create_user方法将数据加密保存到数据库当中,这是Auth模块的关键。
python">class RegisterView(View):def get(self , request):return render(request , 'register.html')def post(self , request):username = request.POST.get("username")password = request.POST.get("password")email = request.POST.get("email")mobile = request.POST.get("mobile")'''create:保存用户数据,密码不加密create_user:密码加密'''User.objects.create_user(username=username , password=password , email=email , mobile=mobile)return redirect('/login/')
3、设置登录视图类:
因为我们上述注册的数据是加密保存到数据库当中的,所以当我们要查这个数据时,就不用常规查找,而是用Auth模块,既authenticate ,它负责加密后认证用户信息,用户存在返回用户数据 , 用户不存在返回 None。
而我们要保存用户登陆状态就用:login方法。
python">class LoginView(View):def get(self , request):return render(request , 'login.html')def post(self , request):username = request.POST.get("username")password = request.POST.get("password")# authenticate 认证用户信息,用户存在返回用户数据 , 用户不存在返回 Noneuser = authenticate(username=username , password=password)if not user:return render(request , 'login.html' , {'error_message':'用户名或者密码错误'})# login 保持用户登录状态# 在请求中能够获取到用户信息,说明用户是登录的 , 否则就没有登录login(request , user)next = request.GET.get('next')if next:return redirect(next)else:return redirect('/index/')
4、重定向过程:
注:我的设计意图是在前端页面有两个a标签,一个是购物车(必须在登陆状态才可以进),另外一个是退出。
使用修饰器:
@login_required 用户验证登录的装饰器
使用的时候需要配置局部的重定向 url
@login_required(login_url='/login/')
python">@login_required(login_url='/login/')
def cart(request):return HttpResponse("<h1>购物车页面</h1>")
@login_required(login_url='/login/')
#注销用户信息:
def logoutview(request):logout(request)return redirect('/login/')
若是不想在装饰器后面添加重定向 url 参数,就可以在setting.py中配置全局:
python">#配置全局
LOGIN_URL='/login/'
五、总结:
该篇博客介绍了Django的Auth模块及其操作,如若各位大佬发现问题或者需要补充的地方,欢迎指正,后续我还会继续更新关于Django的其它内容,欢迎大家关注我等后续更新,您的关注和点赞将是我变强的最大动力。