设为首页 加入收藏

TOP

django-用户验证系统(一)
2017-09-30 17:43:28 】 浏览:350
Tags:django- 用户 验证 系统
django提供了一套用户验证系统,但是要使用这个系统,必须要使用django内置的用户模型:django.contrib.auth.models.User,这个模型中预先定义了一些字段,其中只有username和password是必须的。
 
username
用户名,该字段是必须的,长度限制版本之间可能存在差异,1.10为150个字符以内(其他版本为30个字符,存在版本差异)。可以是字母、数字、+、-、_、.、@。这几个字符。在1.10版本中,django正式支持utf-8的用户名(也就是不受字符限制了),当然前提是要使用python3.x的版本。
 
当然,你也可以使用max_length、min_length等属性来控制用户名的长短限制。下面的字段基本也适用。
 
django在1.10中实现了两个验证器,其会根据python版本自动选取,一般不用我们担心。可以使用username_validator(New in Django 1.10.)属性查看验证器:默认  validators.UnicodeUsernameva lidator于Python 3 、 validators.ASCIIUsernameva lidator于Python 2.
 
当然我们也可以改变验证器,例如将python3的验证器改成ASCII的:
 
from django.contrib.auth.models import User
from django.contrib.auth.validators import ASCIIUsernameva lidator
class CustomUser(User):
  username_validator = ASCIIUsernameva lidator()
  class Meta:
    proxy = True # If no new field is added.

 

上面我们首先子类化了User model,然后改变了username_validator属性,这也是标准的修改步骤。
 
password
密码,必须。django不会直接储存原始密码,而是储存经过处理之后的哈希值。所以在创建用户或修改密码的时候不能直接操作这个属性,而是使用django提供的专门的方法,下面会再说明。
 
email
可选,表示email地址。
 
first_name
可选,30个字符以内(在中文环境中应该用不上)
 
last_name
可选,30个字符以内
 
groups
Many-to-many relationship to  Group
Group属于多对多的关系,而 Group表示的是用户组,由另一种表储存。
 
user_permissions
Many-to-many relationship to  Permission
Permission属于多对多的关系,而 Permission表示的是权限,由另一种表储存。
关于权限的问题需要另外说明,这里暂时不讨论。
 
is_active
表用户是否是活跃的,是一个布尔值。django提议与其删除一个用户的所有信息,还不如将其设置为非活跃(即冻结)状态。这样不会破坏其他相关的外键关系,同时也拥有了后悔的可能。
 
注意:在1.10之前,django的后台验证程序不会检查用户是否处于活跃状态,也就是非活跃的用户依然可以登录,此时要自己进行状态验证,例如:
 
if user.is_active: # 若用户是活跃的,即未冻结的,在1.10之前冻结用户默认也能登录,所以需要自己认证
    login(request, user) # 登录
    ...... #其他处理
else:
    return HttpResponse('用户被冻结')

 

在1.10版本中,django的默认验证后台会拒绝冻结用户的访问了。当冻结的用户登录时,会无法通过  authenticate(username=None, password=None, **kwargs) 的验证,即该方法会返回None。
 
is_staff
是否为staff身份,布尔值。拥有staff身份的用户可以登录django的admin后台,且可以使用  staff_member_required(redirect_field_name='next', login_url='admin:login') 装饰器来进行访问控制。详情参考 django-访问控制 篇。
 
is_superuser
是否是superuser身份,布尔值。拥有该身份的用户将能够登录admin后台,并拥有所有注册模型的管理权限。
 
last_login
用户最后登录的时间。
 
date_joined
用户创建的时间。
 
以上就是django自带的用户认证系统使用的模型的全部字段了,也就是说django在数据库中储存的字段信息就是以上这些,如果需要扩展的话,有两种方法:
 
1.另外再写一个模型,用OneToOne的形式关联到User中:
 
 
from django.db import models
from django.contrib.auth.models import User
 
 
class UserInfo(models.Model):
    user = models.OneToOneField(User)
    head_img = models.ImageField()
    # 其它扩展

 

 
2.另写一个模型,直接继承User:
 
from django.db import models
from django.contrib.auth.models import User
 
 
class UserInfo(User):
    head_img = models.ImageField()
    # 其它扩展

 

 
无论哪种方法都可以,因为那些已经定义好的字段都是储存在User表中的,而新增的字段储存在另外的表中,只是使用OneToOne的时候,查询的入口略麻烦了些,详情参考django的models。
 

用户注册:
 
所谓的用户注册,其实就是在User表中新创建一条记录,而前面说过了,password字段储存的不是原始密码,而是加密后的字符串,所以不能直接对User对象的属性进行修改,而是要调用专用的函数:
 
>>> from django.contrib.auth.m
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python(九) Python 操作 MySQL .. 下一篇Python里隐藏的 " 诗 "

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目