上篇文章我们引出了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()

修改密码:

  1. 用代码的方式,可以使用上篇讲过的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对象的差异:

  1. id永远是None
  2. is_staff和is_superuser永远为False
  3. groups和user_permissions永远为空
  4. is_anoymous()为True
  5. is_authenticated()为False
  6. 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额外信息的更多相关文章

  1. django用户认证系统——自定义认证后台8

    Django auth 应用默认支持用户名(username)进行登录.但是在实践中,网站可能还需要邮箱.手机号.身份证号等进行登录,这就需要我们自己写一个认证后台,用于验证用户输入的用户信息是否正确 ...

  2. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  3. Django的认证系统—auth模块

    Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...

  4. django用户认证系统——拓展 User 模型2

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  5. django用户认证系统——基本设置1

    网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...

  6. Django之认证系统

    Django之认证系统 cookie和session 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞 ...

  7. “Django用户认证系统”学习资料收集

    首推追梦人物——Django用户认证系统 待续……

  8. django用户认证系统——重置密码7

    当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...

  9. django用户认证系统——修改密码6

    再此之前我们已经完成了用户登录.注册.注销等功能,接下来让我们继续为用户提供修改密码的功能.该功能 Django 的 auth 应用也已经为我们提供,过程几乎和之前的登录功能完全一样. 编写修改密码模 ...

随机推荐

  1. nasm中的表达式

    nasm表达式支持2个特殊的记号 $和$$;前者标识其所在源码行的开始处地址,所以你可以这样写死循环: jmp $ 而后者标识当前段开始处的地址,你可以通过: $-$$ 找出当前代码在段内的偏移. n ...

  2. obj-c编程14:Cocoa和Cocoa Touch简介

    这一篇篇幅相对少很多,几乎没有代码,全部都要靠本猫的语言组织能力啊!Cocoa框架在前面讲解F库时曾简单做过介绍,现在再具体说一说喽.各位童鞋是否已经发现鸟,前面所写的所有代码都是基于终端(或称之为c ...

  3. CentOS6.4下安装Nginx1.12.2

    1.安装GCC安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装 yum install gcc-c++ 2.安装PCRE-devel PCR ...

  4. window配置mongodb集群(副本集)

    参数解释: dbpath:数据存放目录 logpath:日志存放路径 pidfilepath:进程文件,有利于关闭服务 logappend:以追加的方式记录日志(boolean值) replSet:副 ...

  5. Spring Cloud入门教程-Ribbon实现客户端负载均衡

    简介 我们继续以之前博客的代码为基础,增加Ribbon组件来提供客户端负载均衡.负载均衡是实现高并发.高性能.可伸缩服务的重要组成部分,它可以把请求分散到一个集群中不同的服务器中,以减轻每个服务器的负 ...

  6. JSON 的含义?

    JSON 的全称是 JavaScript Object Notation,是一种轻量级的数据交换格式.JS ON 与 XML 具有相同的特性,例如易于人编写和阅读,易于机器生成和解析.但是 JSON ...

  7. 第四章:4.2MySQL 权限系统介绍

    4.2.1 权限系统简介 MySQL 的权限系统在实现上比较简单,相关权限信息主要存储在几个被称为granttables 的系统表中,即: mysql.User,mysql.db,mysql.Host ...

  8. unity零基础开始学习做游戏(二)让你的对象动起来

    -------小基原创,转载请给我一个面子 小基认为电子游戏与电影最重要的区别就是交互,如果电子游戏没有让你输入的交互功能的话,全程都"只可远观,而不可鼓捣"的话,你可能是在看视频 ...

  9. 中国的UED们

    UED网址导航:http://www.ux265.com/ 天猫UED:http://ued.tmall.com/ 一淘UED:http://ux.etao.com/ 淘宝UED:http://ued ...

  10. SharePoint2013 功能区的配置

    遇到了很多次对网站功能区个性化定义的任务,包括标签按钮之类的修改,每次都要重新翻书,这次总结一下,留作备用. 添加内容 下面的XML我认为主要的内容是四部分,一个是CommandUIDefinitio ...