Django中内置的权限控制2-User Profile
上篇文章我们引出了Django内置的权限控制系统,讲了安装,和最核心和基本的User模型的API和其Manager的API。
接下来我们继续深入下去,使用User对象做一些事情,首先当然就是创建一个User对象了。
让我们执行python manage.py shell启动Django的shell:
创建User:
1 >>> from django.contrib.auth.models import User 2 >>> user = User.objects.create_user( 'esperyong' , 'esperyong@gmail.com' , '123456' ) 3 # 现在一个is_active属性为True的User对象已经创建并存入数据库中了。 4 # 接下来我们可以对其属性进行修改,然后存入数据库。 5 >>> user.is_staff = True 6 >>> user.save() |
修改密码:
- 用代码的方式,可以使用上篇讲过的set_password方法进行设置,最后存入数据库的将是进行过hash转换的密文。
1
>>>
from
django.contrib.auth.models
import
User
2
>>> u
=
User.objects.get(username__exact
=
'esperyong'
)
3
>>> u.set_password(
'new password'
)
4
>>> u.save()
2. 用python manage.py changepassword *username*来进行修改,需要输入两次密码。
千万不要直接给User的password属性赋值。
匿名用户,AnonymousUser:
django.contrib.auth.models.AnonymousUser是实现了User接口的类。在用户还没有用权限系统登陆的时候,在request.user中使用的就是该对象,用户可以通过调用is_anonymous()方法来验证是否为匿名用户。以下是该对象和User对象的差异:
- id永远是None
- is_staff和is_superuser永远为False
- groups和user_permissions永远为空
- is_anoymous()为True
- is_authenticated()为False
- set_password(),check_password(),save(),delete(),set_groups()和set_permissions()抛出NotImplementedError.
使用UserProfile存储用户的额外信息 :
在Django中,有一种机制可以让你存储和User在某个Site相关的一些信息到一个对象中,这个对象就是UserProfile。
1.首先,我们需要定义这个模型,这个模型需要一个和User模型相关的一对一关系属性,如下:
1 2 3 4 5 6 7 8 9 10 | from django.contrib.auth.models import User class UserProfile(models.Model): # 和User的一对一关系属性,该属性必填. user = models.OneToOneField(User) # 其他需要存储的属性 # User因为是Django提供的,如果想要在其上增加一些自己需要的字段和方法,不太好加入,因此UserProfile是达成这个目标的一个有利工具 accepted_eula = models.BooleanField() favorite_animal = models.CharField(max_length = 20 , default = "Dragons." ) |
2.接下来要在settings中声明一个变量,变量名为AUTH_PROFILE_MODULE,值为 appname.profile类名,如下:
AUTH_PROFILE_MODULE = 'accounts.UserProfile' |
这样,我们的User对象的get_profile()方法就会返回这个对象了。需要注意的一点是,UserProfile对象不会和User一起自动创建,需要以某种方式自己搞定这件事情。最合理的最Djangoist的方式就是注册一个handler到User的post_save signal了。具体请参阅Django的文档,例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 在 models.py from django.contrib.auth.models import User from django.db.models.signals import post_save # 定义了UserProfile # ... def create_user_profile(sender, instance, created, * * kwargs): if created: UserProfile.objects.create(user = instance) post_save.connect(create_user_profile, sender = User) |
本篇文章和上一篇文章说明的Django Authentication系统中的核心基础模型,User模型相关API还有UserProfile的使用方法。
接下来我们要进入实际的Web开发中对这套认证系统的使用,包括用户登录,许可的创建,分配和使用,还有用户组Group的创建和使用。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· .NET 依赖注入中的 Captive Dependency
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(二):用.NET IoT库
· 几个自学项目的通病,别因为它们浪费了时间!
· 在外漂泊的这几年总结和感悟,展望未来
· .NET 数据拷贝方案选择
· .net工作流elsa-书签