官方文档
Django认证系统同时处理身份验证和授权。
Django认证系统包含的应用和中间件:
SessionMiddleware
管理跨请求的会话。AuthenticationMiddleware
使用会话将用户与请求关联起来。>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', '[email protected]', 'johnpassword')
$ python manage.py createsuperuser --username=joe [email protected]
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
authenticate
(request=None, **credentials)
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
# A backend authenticated the credentials
else:
# No backend authenticated the credentials
方法有个request的可选参数。
admin管理员的权限:添加、修改、删除。
当安装了django.contrib.auth应用,对每个已安装的应用都会有三个默认许可--添加、修改、删除。
当运行manage.py migrate时,管理员对模型的默认权限就会被创建,包括已有的模型和新增的模型。
Django使用会话和中间件将认证系统连接到请求对象中。
当用户已经登陆,每个request包含当前用户的用户属性。如果用户没有登陆,这个属性将被设置为一个匿名用户的实例,否则它将成为用户的一个实例。
if request.user.is_authenticated:
# Do something for authenticated users.
else:
# Do something for anonymous users.
login
(request, user, backend=None)
当使用login方法登陆,user id会被添加到session中。
注意,在用户登录之后,在匿名会话期间的任何数据集都会保留在会话中。
authenticate和login通常配合使用。
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
# Redirect to a success page.
else:
# Return an 'invalid login' error message.
logout
(request)
注意,如果用户没有登录,logout不会抛出任何错误。
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
当调用logout,当前请求的session数据会被完全清除,这是为了防止另一个人使用相同的Web浏览器登录并访问前一个用户的会话数据,如果你想往session中添加数据,在调用logout之后再操作。
login_required
装饰器login_required
(redirect_field_name='next', login_url=None)
在django中REDIRECT_FIELD_NAME的默认值是‘next’。
from django.contrib.auth.decorators import login_required
@login_required(login_url='/accounts/login/')
def my_view(request):
...
作用:如果用户未登陆,可以重定向到login url,如果已经登陆,视图代码可以自由地假设用户已经登陆。
当使用基于类的视图时,使用LoginRequiredMixin具有跟
login_required装饰器同样的作用。
from django.contrib.auth.mixins import LoginRequiredMixin
class MyView(LoginRequiredMixin, View):
login_url = '/login/'
redirect_field_name = 'redirect_to'