Django验证用户登陆(同时适用于用户名和密码登陆)

#settings.py
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend']

Django默认的验证方法(不需要注明),这种方法一般只适用于用户名和密码登陆

如果自己想要使用户可以以用户名、密码组合登陆也可以用邮箱、密码登陆则需要自定义用户的验证函数

#views.py
from django.db.models import Q
from django.contrib.auth.backends import ModelBackend

#自定义用户验证函数,实现邮箱或用户名都能登陆
class MyBackend(ModelBackend):
    def authenticate(self,username=None,password=None,**kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username)|Q(email=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None

对应的settings.py需改写为:

#settings.py
AUTHENTICATION_BACKENDS = ('app.views.MyBackend',)

处理函数为:

#views.py
from django.views.generic.base import View
from django.contrib.auth import authenticate,login
from .forms import LoginForm
from django.shortcuts import render
from django.http import HttpResponseRedirect

class LoginView(View):
    def get(self,request):
        return render(request, 'login.html')
    def post(self,request):
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            user_name = request.POST.get('username','')
            password = request.POST.get('password','')

            #与数据库中的用户进行比对
            #上面已经地authenticate进行了重写 若成功则返回user
            user = authenticate(request,username=user_name,password=password)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return HttpResponseRedirect(reverse('main'))
            return render(request, 'login.html', {'msg': '用户名或密码错误!'})
        else:
            print(login_form.errors)
        return render(request,'login.html',{'msg':'用户名或密码错误!'})

在和models.py相同的目录中新建forms.py用来设置登陆用到的表单

# -*- coding:utf-8 -*-
from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(required=True,error_messages={'required':'用户名不能为空',})
    password = forms.CharField(required=True,error_messages={'required':'密码不能为空',})

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值