django有一套成型的注册登录模块,auth 系统包含如下:
Users
Permission
Group
Message
在settings.py配置中,少不了以下配置
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
)
这些一般在创建django项目自动生成,运行 manage.py syncdb
则生成相应的表。
字段
class models.User
User对象的具体字段参考:django官网文档
这里注意is_active
意思是:是否为活跃用户,对于删除用户尽量设置其为false
而非真正的删除,同时也作为是否可登录的判定。
方法
更多参考django官网文档
这里指出几个重点学习。
1、is_anonymous()
:区别匿名用户和可登录用户的方法,往往使用is_authenticated()
。
2、is_authenticated()
:authenticated表示已验证,那么这个方法就是它只表明用户提供一个有效的用户名和密码。
3、set_password(raw_password)
:更改密码,并自动处理hash值
4、check_password(raw_password)
:检测密码是否正确
class models.UserManager
1、create_user(username, email, password=None)
:创建、保存并返回一个User,username,email和password被设置为给定的值,并且User设置了is_active=True.
2、make_random_password()
:
返回给定值和长度的随机密码:
make_random_password(length=10,allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')
1、创建用户
使用create_user()
来创建用户,如下:
from django.contrib.auth.models import User
user = User.objects.create_user('BeginMan','abcd123','[email protected]')
print user.is_staff #True
user.save()
2、更改密码
使用set_password()
进行更改
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username__exact='john')
>>> u.set_password('new password')
>>> u.save()
详细内容参考
1、基本概述
首先,安装SessionMiddleware和AuthenticationMiddleware中间件。把他们加入到MIDDLEWARECLASSES设置中即可。当你安装好这些中间件之后,你就可以在视图(view)中访问request.user了。request.user将返回当前登录的用户的一个User对象。如果当前没有用户登录,那么request.user将返回一个AnonymousUser对象的实例。你可以通过isauthenticated()来判断是否有用户登录,如下:
if request.user.is_authenticated():
#已登录用户
else:
#匿名用户
2、用户登录
Django在django.contrib.auth提供了2个函数:authenticate()
和login()
。
authenticate()
:认证函数:
如果通过给定的用户名和密码做认证,请使用authenticate()函数。他接收2个参数,一个是username一个是password。如果认证成功,它返回一个User对象。如果密码无效,它返回一个None。例如:
from django.contrib.auth import authenticate
user=authenticate(username='john',password='secret')ifuserisnotNone:
print"用户名、密码正确!"else:
print"用户名、密码错误!"
login()
:登录函数
在视图中登录一个用户的话,使用login()函数。它接收HttpRequest对象和一个User对象。login()通过Django的session框架把用户的ID保存到session中。
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# Redirect to a success page.
else:
# Return a 'disabled account' error message
else:
# Return an 'invalid login' error message.
3、用户登出
要登出使用
django.contrib.auth.login()登录的用户的话,可以在视图中使用
django.contrib.auth.logout()。它接收一个HttpRequest参数,没有返回值。例如:
from django.contrib.auth import logout
def logout_view(request):
logout(request)
#转到成功页面
请注意:如果用户没有登录的话,logout()也不会抛出任何异常的。
1、原始方法
原始方法就是重定向
如:if not request.user.is_authenticated():
2、使用login_required()
修饰器
decorators.loginrequired([redirectfieldname=REDIRECTFIELD_NAME])
程序如下:
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
login_required()
原理:
如果用户尚未登录,重定向到settings.LOGIN_URL。
如果用户已经登录则正常执行。
3、已登录用户通过通行测试(passtest)来限制访问
详见官方文档
Django自带了一个简单的权限系统。它为向用户和用户组付权限提供了一个途径。它被用在了Django的admin站点中,当然你也可以把它用在自己的代码中。Django的admin站点是这样应用权限的:
通过"add"权限来控制用户是否可以访问添加表单并添加一个指定类型的对象。通过"change"权限来控制用户是否可以访问指定类型对象的列表和修改表单。*通过"delete"权限来控制用户是否可以删除指定类型的对象。
权限被赋予每种类型的对象,而不是对象的特定的实例。你可以说“玛丽可以修改新的故事(stories)”,但是你不能说“玛丽可以修改她创建的新的故事”或者“玛丽只能修改特定状态的、特定发布时间的、特定ID的故事等等”。这些功能目前Django的开发人员还在讨论之中。
1、默认权限
3个基本的权限--添加(add),创建(create)和删除(delete)--在创建包含有classAdmin的Django模型的时候都自动被创建好了。在表面现象的后面,当你运行manage.pysyncdb的时候,这些权限被添加到了auth_permission数据表中。
请注意,如果你的模型里没有classAdmin的话,当你运行manage.pysyncdb的时候这些权限不会被创建出来。如果你初始化数据库之后还想添加这些权限,可以在模型中加入class Admin然后再运行一次manage.pysyncdb。
2、自定义权限
为了给指定的模型自定义权限,可以使用权限(permissions)的modelMetaattribute。这个例子创建了3个自定义的权限。
class Task(models.Model):
...
class Meta:
permissions = (
("can_view", "Can see available tasks"),
("can_change_status", "Can change the status of tasks"),
("can_close", "Can remove a task by setting its status as closed"),
)
接下来的事情就是运行syncdb来创建这些权限。
3、Permission的API
name:必须。小于等于50个字符。例如:'Canvote'。
contenttype:必须。引用自djangocontenttype数据表,它包含了已经安装的
Django模型的类型。
codename:必须。小于等于100个字符。例如:'canvote'
如果使用
RequestContext
的话,已经登录的用户的user和权限对象就会保存在template context中。
1、用户(Users)
当前登录的用户,不管是否是匿名的还是其他的,都存储在模版变量{{user}}
中。如:
{%ifuser.is_authenticated%}
<p>欢迎,{{user.username}}。谢谢您的来访。</p>
{%else%}
<p>欢迎,请登录。</p>
{%endif%}
2、权限(Permissions)
当前登录用户的权限存储在模版变量{{perms}}
中,是django.core.context_processors_PermWrapper
的实例。
在{{perms}}对象中,单个属性的查找是使用User.hasmoduleperms的。下面这个例子中,如果用户对foo这个app有任何权限的话,它就返回True。{{perms.foo}}
二级属性查找是使用User.hasperm。下面这个例子中,如果用户有foo.canvote权限的话,它就返回True。{{perms.foo.can_vote}}因此,你可以在模板中用{%if%}语句来判断权限
{%ifperms.foo%}
<p>你有操作foo的权限。</p>{%ifperms.foo.can_vote%}
<p>你可以投票。</p>{%endif%}
{%ifperms.foo.can_drive%}<p>你可以开车。</p>{%endif%}{%else%}
<p>你没有操作foo的权限。</p>
{%endif%}
组通常用来归类用户,这样你就可以为这些组里面的用户应用权限或者贴其他的标签。一个用户可以属于任意数量的组。
组中的用户自动获得赋予组的权限。例如,如果组Siteeditors有canedithome_page的权限,那么任何加入这个组的用户都自动拥有这个权限。
组也是归类用户并给他们贴标签或扩展功能的一个方便的途径。例如,你创建一个'Specialusers'的组,你可以写代码来让他们访问网站的会员专区或者发送给他们会员专用的电子邮件。
看了这份文档已经有两天了,有三点感受:
1、英语水平着实太差,很多句子晦涩难懂,导致自己翻译的背离作者原意。
2、一味的看文档不是一个好方法,最好也看看别人的代码,然后自己实践总结
3、做事情要专一,不能分散力量,否则事倍功半的。
下一步:
1、扩展User表