Django用户认证系统使用总结html
by:授客 QQ:1033553122python
测试环境web
Win7算法
Django 1.11数据库
使用Django认证系统django
本文按默认配置讲解Django认证系统的用法。若是默认的认证没法知足项目,Django提供了对认证系统的扩展与定制。后端
Django身份验证同时提供身份验证和受权,一般称为身份验证系统,由于这些特性有些耦合。api
用户对象session
默认user对象主要属性:app
>>>fromdjango.contrib.auth.modelsimportUser
>>>user=User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
#如上,此时用户对象已经被保存到数据库了,能够对它的属性进行修改
>>>user.last_name='Lennon'
>>>user.save()
若是已经安装了Django admin应用,能够直接建立用户
使用createsuperuser 命令:
$ python manage.py createsuperuser --username=joe --email=joe@example.com
回车后,会提示输入密码,输入密码后回车,当即建立用户。若是命令行省略了--username 或--email 选项,则回车后还会提示输入这些选项的值。
Django采用hash算法存储用户密码(参考documentation of how passwords are managed)
经过命令行修改用户密码:
manage.py changepassword user_name
若是不提供user_name,则默认修改当前系统用户的密码.
经过api修改用户密码
>>>fromdjango.contrib.auth.modelsimportUser
>>>u=User.objects.get(username='john')
>>>u.set_password('new password')
>>>u.save()
注:这里new password为明文
若是已经安装了Django admin应用,也能够在认证系统管理页面修改用户密码
修改密码,将注销对应用户的全部会话。
authenticate
(request=None, **credentials)
使用authenticate()来确认一系列认证。函数携带了credentials关键词参数,默认状况为username和password。若是认证经过,则返回对应的User对象,不然返回None:
fromdjango.contrib.authimportauthenticate
user=authenticate(username='john', password='secret')
ifuserisnotNone:
# A backend authenticated the credentials
else:
# No backend authenticated the credentials
除username,password参数以外,咱们还能够添加其它条件:
例子,验证用户帐号密码是否正确,同时要求被验证用户未被删除(is_delete=1),也就是说,验证用户帐号密码前获取的用户数据时,自动已经被删除的用户
user=authenticate(username='john', password='secret',is_delete=1)
固然,除了是否删除,是否禁用等字段,其它字段通常不推荐这么作,能够在验证用户帐号密码前进行其它前置条件的验证
注意:默认的,django会优先验证咱们显示提供的参数,最后再验证is_active是否未1,若是为1,则返回None
略
Django为每一个请求提供了 request.user属性,该属性表明当前用户。若是当前用户未登陆,则该属性值将被设置为一个匿名用户AnonymousUser,不然将设置为User的一个实例。
ifrequest.user.is_authenticated:# 已登陆
# Do something for authenticated users.
...
else:# 未登陆
# Do something for anonymous users.
...
login
(request, user, backend=None)[source]
login函数会保存用户id到session.
注意:用户登陆后,会话中依旧保留登陆前的的任何匿名会话数据。
fromdjango.contrib.authimportauthenticate, login
defmy_view(request):
username=request.POST['username']
password=request.POST['password']
# 验证用户名和密码,返回用户对象
user=authenticate(request, username=username, password=password)
ifuserisnotNone:
login(request, user)
# do something 好比重定向到一个成功页面.
...
else:
# do something,好比返回一个登陆错误消息
...
略.
logout
(request)
例子:
fromdjango.contrib.authimportlogout
deflogout_view(request):
logout(request)
# do something 好比重定向到一个成功页面.
注意:若是用户未登陆,执行logout函数并不会抛出任何异常。
调用logout函数,会清空当前请求的全部会话数据,移除全部已存在数据。
简单,原始的方式就是检查request.user.is_authenticated判断是否定证:
fromdjango.confimportsettings
fromdjango.shortcutsimportredirect
defmy_view(request):
ifnotrequest.user.is_authenticated:
returnredirect('%s?next=%s'% (settings.LOGIN_URL, request.path))
# ...
或者:
fromdjango.shortcutsimportrender
defmy_view(request):
ifnotrequest.user.is_authenticated:
returnrender(request, 'myapp/login_error.html')
# ...
login_required
(redirect_field_name='next', login_url=None)
做为快捷方式,可使用login_required():
fromdjango.contrib.auth.decoratorsimportlogin_required
@login_required
defmy_view(request):
...
login_required() 作如下事情:
默认的,查询字符串参数名称为“next”,若是想用其它名称,须要使用loging_required的可选参数redirect_field_name,举例以下
fromdjango.contrib.auth.decoratorsimportlogin_required
@login_required(redirect_field_name='my_redirect_field')
defmy_view(request):
...
对应的,html模板中也要使用对应参数名称。
login_required()还携带了可选参数 login_url。例:
fromdjango.contrib.auth.decoratorsimportlogin_required
@login_required(login_url='/accounts/login/')
defmy_view(request):
...
注意,若是不指定login_url参数,则须要配置settings.LOGIN_URL.
更多详情,参考官方文档。
一些常见的装饰器
@require_POST # 设置视图的http访问方法必须为POST
@require_GET # 设置视图的http访问方法必须为GET
例子:设置视图的访问方法必须为POST
from django.views.decorators.http import require_POST,require_GET
@require_POST
def test_page(request):
return render(request, 'website/pages/mytest.html',{})
访问效果
略
略
略
略
略
略
略
略
略
略
当使用RequestContext,而且开启了'django.contrib.auth.context_processors.auth'上下文处理器时(可在settings.py中配置),当前已登陆用户和他们的权限都被存储为变量,存放在模板上下文中。
例子:
{%ifuser.is_authenticated%}
<p>Welcome, {{user.username}}. Thanks for logging in.</p>{%else%}
<p>Welcome, new user. Please log in.</p>{%endif%}
若是未使用RequestContext,则模板变量不可获取,好比上述的 {{ user }}
略
略
参考连接