标签:auth nbsp 情况下 定义 装饰器 pytho object 结合 类型
我们在之前的Django学习中,每次makemigration之后会发现里面有好多自动生成的表,之前我们不知道这里面都是些什么,今天就知道了,这么多表里面就包括了auth_user表,这个就是我们今天的主角了
导入auth模块
from django.contrib import auth
我们再学习他每种功能的方法就能利用auth模块实现用户认证中的用户注册、用户登录、用户认证、注销、修改密码等功能
常用方法我们在下面会详细介绍
这里我们需要注意的是:我们用了auth模块来作为我们的用户认证功能模块就要全部都用auth模块里的方法,不能说用auth里的注册登录,然后自己写注销改密码功能,这样是不被允许的,要做就做全套的
user = authenticate(username=‘usernamer‘,password=‘password‘)
# 括号内必须同时传入用户名和密码
auth.login(request,user_obj) # 类似于request.session[key] = user_obj # 主要执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象
request.user.is_authenticated()
我们要获取当前登录的用户,直接可以在request后面取user就能获得当前登录的用户对象
request.user
我们先要导入login_required模块
from django.contrib.auth.decorators import login_required
这里有两种配置方法,一种是局部,只针对某些模块添加登录校验,还有一种是全局。分别是这样设置的:
@login_required(login_url=‘/login/‘)
在对应需要加装饰器的里面加参数
在settings里面加
LOGIN_URL = ‘/login/‘
这样就应用到全局里了,相当于对所有加了@login_required的模块都在里面放了login_url=‘/login/‘
对于上面两种配置方法,我们来总结一下:
局部 > 全局
全局的好处在于无需重复写代码 但是跳转的页面却很单一
局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面
request.user.check_password(old_password)
就完成了密码的比对,返回值是布尔类型
request.user.set_password(new_password)
这样设置完,仅仅是改变了对象的属性,数据库里面用户的密码可不会改变,这里一定要加一个保存数据才能真正完成密码修改
request.user.save()
auth.logout(request)
User.objects.create(username=username,password=password)
我们使用我们之前的操作Django ORM的方法来添加用户行不行呢
并不行,在执行完上面的代码后,表里面我们可以看到能正常添加一条数据,但是这里我们得到的用户的password字段是明文,这样是不合理的,所以这种用法我们是不能使用的,我们创建用户应该用的是下面的create_user()方法才行
User.objects.create_user(username=username,password=password)
同时我们也可以创建管理员,我们可以在控制台命令创建
python3 manage.py createsuperuser
也可以用auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。
User.objects.create_superuser(username=username,email=‘123@qq.com‘,password=password)
这里需要注意的是,我们通过控制台命令创建的管理员可以不加email,但是用create_superuser创建的一定要写email
class UserDetail(models.Model): phone = models.BigIntegerField() user = models.OneToOneField(to=‘User‘)
虽然说可以,但是我们不推荐这种做法。
Django中推荐的是让我们继承AbstractUser自定义一个Model类来扩展auth_user表,这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了
具体实现如下
class UserInfo(AbstractUser): phone = models.BigIntegerField()
如果继承了AbstractUser,那么在执行数据库迁移命令的时候auth_user表就不会再创建出来了,而UserInfo表中会出现auth_user所有的字段外加自己扩展的字段
这么做的好处在于你能够直接点击你自己的表更加快速的完成操作及扩展
但是要注意下面几点:
1.在继承之前没有执行过数据库迁移命令
auth_user没有被创建,如果当前库已经创建了那么你就重新换一个库
2.继承的类里面不要覆盖AbstractUser里面的字段名
表里面有的字段都不要动,只扩展额外字段即可
3.需要在配置文件中告诉django你要用UserInfo替代auth_user(******)
AUTH_USER_MODEL = ‘app01.UserInfo‘
‘应用名.表名‘
标签:auth nbsp 情况下 定义 装饰器 pytho object 结合 类型
原文地址:https://www.cnblogs.com/heirenxilou/p/13072002.html