转载:django用户验证相关
Django里面的User、login、logout、authenticate模块讲解
1、User模块相关知识
user模型各个字段的说明
属性 |
描述 |
Id |
int类型,数据表主键 |
Password |
varchar类型,代表用户密码,在默认情况下使用pbkdf2_sha256方式来存储和管理用户的密码 |
username |
必填; 少于等于30字符. 只允许字符,数字,下划线 |
first_name |
可选; 少于等于30字符,代表用户的名字 |
last_name |
可选; 少于等于30字符,代表用户的姓氏 |
|
可选. 邮件地址. |
password |
必填. 密码的摘要hash(Django不会存储原始密码),详见密码章节部分 |
is_staff |
布尔值. 用户是否拥有网站的管理权限. |
is_active |
布尔值. 是否允许用户登录, 设置为False,可以不用删除用户来禁止 用户登录 |
is_superuser |
布尔值. 用户是否拥有所有权限,而无需任何显式的权限分配定义 |
last_login |
用户最后登录的时间,缺省会设置为当前时间 |
date_joined |
创建用户的时间,当用户创建时,缺省的设置为当前的时间 |
user方法
方法 |
描述 |
is_authenticated() |
如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。通过认证并不意味着 用户拥有任何权限,甚至也不检查该用户是否处于激活状 态,这只是表明用户成功的通过了认证。 |
is_anonymous() |
如果是个 AnonymousUser ,返回值为 True , 如果是 User 对象,返回值为 False 。一般来 说, is_authenticated() 会比这个方法更常用些。 |
get_full_name() |
返回值为: first_name 加上 last_name ,以 空格分隔。 |
set_password(passwd) |
将用户的密码设置为给定的字符串,实际密码已被哈希 处理。这时并不会真正保存 User 对象。 |
check_password(passwd) |
如果给定的字符串通过了密码检查,返回 True 。 密码比较已进行了哈希处理。 |
get_group_permissions() |
返回用户通过所属组获得的权限列表 |
get_all_permissions() |
返回用户通过所属组和用户自身权限所获得的所有权限 列表。 |
has_perm(perm) |
如果用户拥有给定的权限,返回 True , perm 应形如 "package.codename" 的格式。如果用户处于 非激活状态,则总是返回 False 。 |
has_perms(perm_list) |
如果用户拥有所有给定的权限,返回 True 。 如果用户处于非激活状态,则总是返回 False 。 |
has_module_perms(app_label) |
如果用户拥有任何给定 app_label 的权限,返回 True 。如果用户处于非激活状态,则总是返回 False |
get_and_delete_messages() |
返回用户的 Message 对象列表,并从队列中删除。 |
email_user(subj, msg) |
给用户发送电子邮件,用 DEFAULT_FROM_EMAIL 的设 置作为发件人。也可以用第3个参数 from_email 来 覆盖设置。 |
get_profile() |
返回用户的网站自定义profile,详见Profile章节 |
2、authenticate模块
认证给出的用户名和密码,使用authenticate()函数。它接受两个参数,用户名username和密码password,并在密码对给出的用户名合法的情况下返回一个User对象。如密码不合法,authenticate()返回None。
1
2
3
4
5
6
|
>>> from django.contrib import auth >>> user = auth.authenticate(username = 'john' , password = 'secret' ) >>> if user is not None : ... print "Correct!" ... else : ... print "Invalid password." |
3、登录和验证
authenticate()只是验证一个用户的证书而已。而要登录一个用户,使用login()。该函数接受一个HTTPRequest对象和一个User对象作为参数并使用Django的会话(session)框架把用户的ID保存在该会话中。
下面例子演示如何在一个视图中同时使用authenticate()和login()函数
1
2
3
4
5
6
7
8
9
10
11
|
from django.contrib import auth def loginView(request): username = request.POST.get( 'username' , '') password = request.POST.get( 'password' , '') user = auth. authenticate(username = username, password = password) if user is not None and user.is_active: auth.login(request, user) return HttpResponseRedirect( '/account/loggin' ) else : return HttpResponseRedirect( '/account/invalid' ) |
在这里,有个有意思的是:user.is_active,用来判断用户名密码是否有效性
4、注销用户
注销一个用户,在你的视图中使用logout()。它接受一个HTTPRequest对象并且没有返回值,因为没有返回值,徐媛媛返回一个页面。
1
2
3
4
5
|
from django.contrib import auth def logoutView(request): auth.logout(request) return HttpResponseRedirect( '/account/logou' ) |
需要注意的是:
即使用没有登录,logout()也不会抛出异常