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.UnicodeUsernameValidator于Python 3 、validators.ASCIIUsernameValidator于Python 2.
 
当然我们也可以改变验证器,例如将python3的验证器改成ASCII的:
 
from django.contrib.auth.models import User
from django.contrib.auth.validators import ASCIIUsernameValidator
class CustomUser(User):
  username_validator = ASCIIUsernameValidator()
  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.models import User >>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
此时,用户就已经创建并放到数据库中了,这个方法比较特别,其自动为我们保存数据。
 

密码修改:
 
由于密码字段不能直接操作,所以django也提供了函数专门用来修改密码:
 
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
这里有一个细节,它不像创建账户一样会直接保存的数据库中,而是调用User对象的save()方法,表示将修改保存到数据库中。
 

资料修改:
 
其他的字段可以通过直接修改对象属性的方法来修改数据,然后调用保存方法。
 
例如,我想修改用户的email:
 
request.user.email = date['email'] # date的表单提交上来的数据
request.user.save() # 保存修改
 
一般资料修改需要用户登录之后才能修改,而登录后的用户可以是使用request.user来获取当前登录的用户,然后我们直接对其email属性进行修改,数据来自于用户提交的表单(你可以直接将其看成'scolia@example.com'这样的直接的字面量)。最后我们调用其save方法,其实除了password相关的操作需要调用辅助函数之外,其他的基本都能这样修改,这也是模型数据修改的典型方法。
 

用户验证:
 
要实现我们平常需要的验证登录的功能,需要两个步骤,第一步是验证用户名和密码是否正确,第二步将用户登录。
 
from django.contrib.auth import authenticate

user = authenticate(username=date['user_name'], password=date['password'])
username和password两个参数分别接受要登录用户的用户名和密码,这里传的是明文。若验证通过,其会返回User对象,这个User对象记录了所用的用户信息,你可以对这个对象进行资料的修改等之类的操作。若登录失败则返回None
 
用户登录:
 
验证成功之后,就可以进行登录操作了,django提供了专门的登录函数来处理这个工作:
 
from django.contrib.auth import authenticate, login

user = authenticate(username=date['user_name'], password=date['password'])

if user is not None:
login(request, user)
#.....
else:
return HttpResponse('用户名或密码错误')
这里的核心思想就是登录失败后,返回的是None,而判断到user不为None,即验证成功了,就可以
进行登录操作了,否则返回错误。
 
这里详细的了解一下login这个函数:
 
 login(request, user, backend=None) 
 
其中request要求的是HttpRequest对象,也就是视图的第一个参数所接受到的对象,习惯性的使用request,user要求要登录的User对象,也就是验证成功后返回的User对象。backend是1.10中新增的,其作用是指定特点的后台程序,一般用不着,若有特殊需求可以参考django1.10的官方文档。
 
由于HTTP协议是无状态协议,所以使用的拓展的cookie和session首部来进行状态记录,django采用的是session,在登录成功后,django会给客户端设置session首部,其一般是一个用户的ID,而不是用户的详细信息。客户端登录后访问时都会回送这个ID,django接受到ID后找到对应的用户,从而得知当前的访问是哪个用户。实现了登录的功能。
 

用户注销:
 
上面说过用户的状态是通过session来记录的,也就是将session设置为空后,即丢失登录状态,这就是注销了。django同样提供了变量的函数来完成这个工作:
 
 
from django.contrib.auth import logout

def logout_view(request):
logout(request) # Redirect to a success page.
让我们来认识一下这个函数:
 
 logout(request) 
 
其接收的只有一个参数,也就是当前的request对象。其所完成的就是重置session的工作。如果用户没有登录,也不会报错。
 
注意:这个还是会清空所有的session,也就是说如果你有不希望被删除的session的话,要先获取到相应的session,并在调用logout之后再将其收到添加进去。
 

 
这里初步解释了django中用户验证系统的使用,要获取更多信息可以查看官方文档,或者个人提供了一份略微翻译了的文档:http://note.youdao.com/yws/public/redirect/share?id=b67cd6af80e4c59da71c47b85b5f3253&type=false

django-用户验证系统的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. D django 用户认证系统

    django认证系统包含三个部分:用户.权限和分组 安装 django项目默认启用了认证系统,如果不是使用django-admin.py创建项目的可以通过在settings配置文件里面的INSTALL ...

  8. 14:django 用户认证系统

    django认证系统包含三个部分:用户.权限和分组 安装 django项目默认启用了认证系统,如果不是使用django-admin.py创建项目的可以通过在settings配置文件里面的INSTALL ...

  9. django用户认证系统——登录4

    用户已经能够在我们的网站注册了,注册就是为了登录,接下来我们为用户提供登录功能.和注册不同的是,Django 已经为我们写好了登录功能的全部代码,我们不必像之前处理注册流程那样费劲了.只需几分钟的简单 ...

  10. Django用户认证系统(三)组与权限

    Django的权限系统很简单,它可以赋予users或groups中的users以权限. Django admin后台就使用了该权限系统,不过也可以用到你自己的代码中. User对象具有两个ManyTo ...

随机推荐

  1. 重新学习Servlet二

    重新学习Servlet public abstract class HttpServlet extends GenericServlet package com.xh.test.api; import ...

  2. Linux 内核里的“智能指针”【转】

    转自:http://blog.jobbole.com/88279/ 众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异 ...

  3. vue学习生命周期(created和mounted区别)

    created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图(例如ajax请求列表). mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom ...

  4. ES系列二、CentOS7安装ES head6.3.1

    1.Head插件简介 ElasticSearch-head是一个H5编写的ElasticSearch集群操作和管理工具,可以对集群进行傻瓜式操作. 显示集群的拓扑,并且能够执行索引和节点级别操作 搜索 ...

  5. 测试开发之前端——No8.HTML5中的媒介事件

    媒介事件 由视频.图像以及音频等媒介触发的事件. 适用于所有 HTML 5 元素,不过在媒介元素(诸如 audio.embed.img.object 以及 video)中最常用: 属性 值 描述 on ...

  6. 使用ts-loader与webpack编译typescripts出现Module build failed: TypeError: Cannot read property 'afterCompile' of undefined

    解决方法 将ts-loader从4.0降低到3.1.1解决问题.是由于webpack和ts-loader版本不兼容造成的.

  7. 关系操作符 == != equals()

    ==  和!= //: object/test.java package object; import java.util.*; public class Test{ public static vo ...

  8. 性能测试六:jmeter进阶之Cookie与header管理器

    一.http cookie管理器 可以在浏览器中抓取到cookie信息,然后通过http cookie管理器为http请求添加cookie信息 添加cookie管理器后,Jmeter可以自动处理coo ...

  9. DOMContentLoaded与load的区别

    声明:此文章为转载(点击查看原文),如有侵权24小时内删除.联系QQ:1522025433. (1)在chrome浏览器的开发过程中,我们会看到network面板中有这两个数值,分别对应网 络请求上的 ...

  10. python 全栈开发,Day130(多玩具端的遥控功能, 简单的双向聊天,聊天记录存放数据库,消息提醒,玩具主动发起消息,玩具主动发起点播)

    先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.3.zip 注意:由于涉及到 ...