如果只是在数据库中创建一个用户表来实现注册登录,简单的实现会单一而薄弱,而django自带的用户表只用来登录后台,那么它的一系列验证机制就无太大用武之地了,所以,这里所说的注册登录使用django自带的用户表。
django版本1.11
可以直接使用django的用户表,但是往往还需要重新定义用户模型,因为默认的用户表中的字段未必能满足我们的需要,引入AbstractUser类作为父类,如下所示:
from django.contrib.auth.models import AbstractUser
可以添加一些我们需要的字段,如下图所示,我加入了昵称和性别字段:
然后需要在settings中配置用户模型为自定义的用户模型
注意这里是直接使用 app名 . 自定义用户模型类名
执行makemigrations和migrate,生成数据变更文件并执行它,就会在数据库中生成这个表(记得配置app)
注册其实就是常规的思路,目的就是在用户表中插入一条数据,所以只提及了注意事项而没有具体的实现流程,但是对于密码要使用django中的一个make_password函数进行加密
使用make_password进行加密,需要先进行引入(再次的强调,因为加密的密码才能通过登录的验证)
from django.contrib.auth.hashers import make_password
用户名去重
登录除了验证用户表中的数据,并且还要在session表中加入一条数据。其他的操作也就是一个验证session表中数据的过程。
from django.contrib.auth.backends import ModelBackend #默认的验证类,作为自定义验证类的父类
from django.contrib.auth import authenticate #进行验证的类
from django.contrib.auth import login, logout #django中登录和注销
from django.db.models import Q #查询条件
from django.contrib.auth.views import login_required #验证登录的装饰器
class MyBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = UserModel.objects.get(Q(email=username)|Q(username=username))
#使用 | 让邮箱和用户名都可以作为登录条件
if user.check_password(password):
#这里的check_password就是把密码加密之后进行验证
return user
else:
return
except Exception as e:
return
仍然需要在settings中配置,否则不会使用自定义的验证类
注意逗号,元组在只有一个元素时要加上逗号,否则括号会被当成运算符,会产生不可预知的错误
从表单中得到用户名和密码之后,使用验证类进行验证,可以看到如果验证通过会返回一个user对象,使用login(request, user)就会在session表中保存登录的记录
def post(self, request):
form = LoginForm(request.POST)
data = {'form': form}
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(request=request, username=username, password=password)
if user:
login(request, user)
return redirect('/')
else:
data['msg'] = '用户名或密码错误!'
else:
data['msg'] = '请确认输入合法'
return render(request, 'login.html', data)
使用logout注销非常的简单,但是我们可以联想到它是删除了session表中的对应用户数据
注意重名的问题
def mylogout(request):
logout(request)
return redirect('/')
在登录之后,request中就会有对应的用户信息
request.user.is_authenticated 可以判断用户是否登录,不仅可以在视图函数中使用,而且可以应用在模板中。
使用 login_required 装饰器应用在一些需要登录才能操作的视图函数上,则该函数就必须在登录之后才能正常作用,否则无法进行操作,并跳转到登录的路由,登录的路由需要进行配置,如下图所示: