django中默认User

这篇文章在博客园有出处的,是某位大神创作的,然后自己为了研究用户登录注册的问题,所以把它copy到简书上,希望可以帮到大家。

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.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之后再将其收到添加进去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,106评论 6 542
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,441评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,211评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,736评论 1 317
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,475评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,834评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,829评论 3 446
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,009评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,559评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,306评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,516评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,038评论 5 363
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,728评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,132评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,443评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,249评论 3 399
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,484评论 2 379

推荐阅读更多精彩内容