本文的django view采用的是基于cbv的模式html
django中的登陆功能主要涉及到django.contrib.auth这个包,它提供了2个重要的函数:authenticate和login。数据库
这个函数接受的一个收集参数,但至少须要接受username和password这两个关键参数,它完成如下的事情:django
login只会用在auth.authenticate返回一个user的状况下,这个函数会接着作下面的事情:bash
讲了那么多,咱们来看一下代码:cookie
class LoginView(View):
def get(self, request):
pass
def post(self, request):
username = request.POST.get('username', '')
password = request.POST.get('password', '')
login_form = LoginForm(request.POST)
if login_form.is_valid:
user = auth.authenticate(username=username, password=password)
if user is not None:
login(request, user)
# 若是登入成功,重定向要主页
return HttpResponseRedirect(reverse('index'))
else:
# user为None,说明帐号或密码错误
return render(request, "login.html", {"msg": "用户名或密码错误"})
else:
# 表单无效,返回login_form对象便可,在template调用login_form.errors这个字典去获取相关的错误
return render(request, "login.html", {"login_form": login_form})
复制代码
显然,若是单纯使用ModelBackend.authenticate的验证逻辑是不能知足咱们的需求,咱们登陆的帐号能够是username,也能够是手机/邮箱等,这时候,咱们能够进行一个自定义的登陆逻辑验证。session
# app+views+backend名字
AUTHENTICATION_BACKENDS = (
'users.views.MyUserBackend',
)
复制代码
from django.db.models import Q
from django.contrib.auth.hashers import make_password
class MyUserBackend(ModelBackend):
""" 自定义用户验证 """
def authenticate(self, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username) | Q(email=username) | Q(mobile=username))
if user.check_password(password):
return user
except Exception as e:
return None
复制代码
顺便说起一下logout函数,因为django已经为咱们提供好了退出的处理,使用起来十分简单:app
class LogoutView(View):
def get(self, request):
logout(request)
return HttpResponseRedirect(reverse('index'))
复制代码
logout函数主要完成:函数