django(权限、认证)系统——自定义UserProfile储存User额外信息
上篇文章我们引出了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模型相关的一对一关系属性,如下:
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的文档,例:
# 在 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的创建和使用。
django(权限、认证)系统——自定义UserProfile储存User额外信息的更多相关文章
- django用户认证系统——自定义认证后台8
Django auth 应用默认支持用户名(username)进行登录.但是在实践中,网站可能还需要邮箱.手机号.身份证号等进行登录,这就需要我们自己写一个认证后台,用于验证用户输入的用户信息是否正确 ...
- django用户认证系统——拓展 User 模型
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- Django的认证系统—auth模块
Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...
- django用户认证系统——拓展 User 模型2
Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...
- django用户认证系统——基本设置1
网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...
- Django之认证系统
Django之认证系统 cookie和session 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞 ...
- “Django用户认证系统”学习资料收集
首推追梦人物——Django用户认证系统 待续……
- django用户认证系统——重置密码7
当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...
- django用户认证系统——修改密码6
再此之前我们已经完成了用户登录.注册.注销等功能,接下来让我们继续为用户提供修改密码的功能.该功能 Django 的 auth 应用也已经为我们提供,过程几乎和之前的登录功能完全一样. 编写修改密码模 ...
随机推荐
- JavaScript脚本放在哪里用户体验好
javascript代码写在<head>里面: 由于这时候网页主体(body)还未加载,所以这里适合放一些不是立即执行的自定义函数,立即执行的语句则很可能会出错(视浏览器而定) javas ...
- Linux 命令——tee 重定向到文件并打印到屏幕
需求: 源于我一个业务实现,需要通过shell脚本去调Java程序,并且能够拿到Java里面的返回值. 思路: 众所周知,通过shell调用Java,肯定是通过 Java -jar xxx.jar 命 ...
- Yii2数据接口
写接口之前先确认那你已经安装了Yii2的basic版或者advanced版,如果还没有,赶快去看这篇文章:composer安装Yii2. 现在默认你已经安装了basic版或者advanced版了,并且 ...
- Spring框架碰壁日常更新
关于Spring环境搭建遇到的问题:
- 部署网站: 配置项目到iis上运行报目录错误
配置项目到iis上运行报目录错误 以下三种方法可使用: 1.添加文件访问权限 everyone (线上环境慎用) 2.重新注册iis 3.web.config 加一段话 在<system.we ...
- 架构之微服务设计(Nginx + Upsync)
Upsync,微博开源基于Nginx容器动态流量管理方案 . Nginx 以其超高的性能与稳定性,在业界获得了广泛的使用,微博的七层就大量使用了 Nginx .结合 Nginx 的健康检查模块,以及动 ...
- ES2015也就是ES6知识点持续更新
ES6,全名:ECMAScript2015,先扯点其他的,ECMA是一个国际标准化组织,它最重要最重要的作用就是让ECMAScript这门语言标准化,什么意思呢?我们知道,js这门脚本语言是运行在浏览 ...
- python3 爬取qq音乐作者所有单曲 并且下载歌曲
1 import requests import re import json import os # 便于存放作者的姓名 zuozhe = [] headers = {'User-Agent': ' ...
- git进阶
一.刚提交的代码,发现需要微调一下 刚刚最新提交了一段代码,然后跟前端说,接口好了.过了2分钟,前端跟你说,哎,兄弟,那个金额能不能返回整数,不要小数点. 这个时候一般我们通常会修改一下之后,再提交一 ...
- AngularJS 最常用的几种功能
AngularJS 最常用的几种功能 2017-04-13 吐槽阿福 互联网吐槽大会 第一 迭代输出之ng-repeat标签ng-repeat让table ul ol等标签和js里的数组完美结合 1 ...